2016-03-27 10 views
2

学校プロジェクト用の在庫システムを作成しようとしています。人々が食料品を自分が作るカテゴリーに入れることができるようになっています。他のウィンドウを閉じた後にTkinterのウィンドウを更新する方法:Python 3.5

1つの食品アイテムを追加できるカテゴリの一覧を表示するウィンドウを更新しようとするのが難しいです。

class AddTab: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.master.minsize(width = 800, height = 480) 
     self.master.maxsize(width = 800, height = 480) 
     self.master.geometry('800x480+0+0') 

     self.label = tk.Label(self.master, text = 'ADD TO CATEGORY') 
     self.label.pack(anchor = 'n') 

     self.frame.pack() 

     catnames = open('categorynames.txt','r').read().splitlines() 

     for name in catnames: 
      addbutton = tk.Button(self.frame, text = '+1 '+name, width = 20, command = lambda name = name: self.addtocategory(name)) 
      addbutton.pack() 

     addnewcat = tk.Button(self.frame, text = 'ADD NEW CATEGORY', width = 100, command = self.addnewcategory) 
     addnewcat.pack(anchor = 's') 

このコードは、メインループ切り替えスイッチです。

def main(): 
    root = tk.Tk() 
    app = MainMenu(root) 
    root.geometry('800x480+0+0') 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

これは、AddTabウィンドウに表示される新しいカテゴリを追加するウィンドウのコードです。私は新しい名前を入力すると

class NewCategory: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.master.minsize(width = 400, height = 240) 
     self.master.maxsize(width = 400, height = 240) 
     self.master.geometry('400x240+0+0') 

     self.label = tk.Label(self.frame, text = 'ADD NEW CATEGORY') 
     self.label.grid(row = 1, column = 1, columnspan = 2) 

     self.newcatentry = tk.Entry(self.frame, width = 50) 
     self.newcatentry.grid(row = 2, column = 1, columnspan = 2) 

     quitbutton = tk.Button(self.frame, text = 'QUIT', width = 25, command = self.closewindow) 
     quitbutton.grid(row = 3, column = 1) 

     enterbutton = tk.Button(self.frame, text = 'ENTER', width = 25, command = self.entryget) 
     enterbutton.grid(row = 3, column = 2) 

     self.frame.grid(row = 0, column = 0) 

    def entryget(self): 
     entrydata = self.newcatentry.get() 
     catnameopen = open('categorynames.txt','a') 
     catnameopen.write(entrydata+'\n') 
     catnameopen.close 
     catnamefile = open(entrydata+'.txt','a') 
     catnamefile.close 

     if os.stat(entrydata+'.txt').st_size == 0: 
      categoryedit = open(entrydata+'.txt', 'w') 
      categoryedit.write('0') 
      print('it worked') 
      categoryedit.close 
      print('derp') 

     self.master.destroy() 

    def closewindow(self): 
     self.master.destroy() 

は、ボタンとして新しいカテゴリでAddTab更新を除くことになっているすべてを行います。

私がインターネットで検索したことの多くは、メインループが「イベント処理」や更新を行っていると言います。私はこれが何を意味するのか、特に私が見た多くのプログラムが__init__にすべてのウィジェットを持っているかどうかは分かりません。

私は自分でPythonを学びたいと思っています。これの多くはおそらく悪い(ひどい)プログラミングであり、それはプログラミングへの私の最初の挑戦であり、私は喜んで学びます。

誰かが完全なコードを見たいと思えば、私もそれを投稿することができます。

編集:ここでは

が要求されるように、完全なコードです:それは基本的にAddTabのコピーとなりますよう

import tkinter as tk 
import os 

filetuple = ('categorynames', 'barcodes') 
for filename in filetuple: 
    fileopen = open(filename+'.txt','a') 
    fileopen.close 

catnameopen = open('categorynames.txt','r').read().splitlines() 
print(catnameopen) 
for categoryname in catnameopen: 
    print(categoryname) 
    categoryamt = open(categoryname+'.txt','a') 
    categoryamt.close 

    if os.stat(categoryname+'.txt').st_size == 0: 
     categoryedit = open(categoryname+'.txt', 'w') 
     categoryedit.write('0') 
     print('it worked') 
     categoryedit.close 
     print('derp') 
    else: 
     print("not needed") 

class MainMenu: 
    def __init__(self, master): 
     self.master = master 
     self.master.minsize(width = 800, height = 480) 
     self.master.maxsize(width = 800, height = 480) 
     self.master.geometry('800x480+0+0') 
     self.frame = tk.Frame(self.master) 

     self.addtabbutton = tk.Button(self.frame, text = 'ADD FOOD', width = 100, command = self.addtabwindow) 
     self.addtabbutton.pack() 

     self.subtabbutton = tk.Button(self.frame, text = 'SUBTRACT FOOD', width = 100, command = self.subtabwindow) 
     self.subtabbutton.pack() 

     self.quitbutton = tk.Button(self.frame, text = 'QUIT', width = 100, command = self.closewindow) 
     self.quitbutton.pack() 

     self.frame.pack() 

    def closewindow(self): 
     self.master.destroy() 

    def addtabwindow(self): 
     self.addtabwindow = tk.Toplevel(self.master) 
     self.app = AddTab(self.addtabwindow) 

    def subtabwindow(self): 
     self.subtabwindow = tk.Toplevel(self.master) 
     self.app = SubTab(self.subtabwindow) 

class NewCategory: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.master.minsize(width = 400, height = 240) 
     self.master.maxsize(width = 400, height = 240) 
     self.master.geometry('400x240+0+0') 

     self.label = tk.Label(self.frame, text = 'ADD NEW CATEGORY') 
     self.label.grid(row = 1, column = 1, columnspan = 2) 

     self.newcatentry = tk.Entry(self.frame, width = 50) 
     self.newcatentry.grid(row = 2, column = 1, columnspan = 2) 

     quitbutton = tk.Button(self.frame, text = 'QUIT', width = 25, command = self.closewindow) 
     quitbutton.grid(row = 3, column = 1) 

     enterbutton = tk.Button(self.frame, text = 'ENTER', width = 25, command = self.entryget) 
     enterbutton.grid(row = 3, column = 2) 

     self.frame.grid(row = 0, column = 0) 

    def entryget(self): 
     entrydata = self.newcatentry.get() 
     catnameopen = open('categorynames.txt','a') 
     catnameopen.write(entrydata+'\n') 
     catnameopen.close 
     catnamefile = open(entrydata+'.txt','a') 
     catnamefile.close 

     if os.stat(entrydata+'.txt').st_size == 0: 
      categoryedit = open(entrydata+'.txt', 'w') 
      categoryedit.write('0') 
      print('it worked') 
      categoryedit.close 
      print('derp') 

     self.master.destroy() 

    def closewindow(self): 
     self.master.destroy() 

class AddTab: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.master.minsize(width = 800, height = 480) 
     self.master.maxsize(width = 800, height = 480) 
     self.master.geometry('800x480+0+0') 

     self.label = tk.Label(self.master, text = 'ADD TO CATEGORY') 
     self.label.pack(anchor = 'n') 

     self.frame.pack() 

    def loopstuff(self): 

     catnames = open('categorynames.txt','r').read().splitlines() 

     for name in catnames: 
      addbutton = tk.Button(self.frame, text = '+1 '+name, width = 20, command = lambda name = name: self.addtocategory(name)) 
      addbutton.pack() 

     addnewcat = tk.Button(self.frame, text = 'ADD NEW CATEGORY', width = 100, command = self.addnewcategory) 
     addnewcat.pack(anchor = 's') 


    def addnewcategory(self): 
     self.addnewcategory = tk.Toplevel(self.master) 
     self.app = NewCategory(self.addnewcategory) 

    def addtocategory(self, name): 
     print(name) 
     nameamt = open(name+'.txt','r').read() 
     nameamt = int(nameamt) + 1 
     newamt = open(name+'.txt','w') 
     newamt.write(str(nameamt)) 
     newamt.close 

class SubTab: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.master.minsize(width = 800, height = 480) 
     self.master.maxsize(width = 800, height = 480) 
     self.master.geometry('800x480+0+0') 

     self.label = tk.Label(self.master, text = 'SUBTRACT FROM CATEGORY') 
     self.label.pack() 

     catnames = open('categorynames.txt','r').read().splitlines() 

     #for name in catnames: 
      #self.catnamebutton = tk.Button(self.frame, text = name, width = 30) 
      #self.catnamebutton.pack() 

     self.frame.pack() 

def main(): 
    root = tk.Tk() 
    app = MainMenu(root) 
    root.geometry('800x480+0+0') 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

サブタブは基本的に無視することができます。

+0

投稿したコードに問題があると思われます。 'NewCategory'と' AddTab'はどちらも 'Frames'です(継承を使うべきです... Python 3 C'mon)。あなたの質問のタイトルが書いている問題( "windows"について)は、複数のTk 'Application'を持つことになります。 'NewCategory'を呼び出したり構築したりするあなたのコードはどこですか?おそらくどこかで 'show()'のようなことをするでしょうか? – Tersosauros

+0

@Tersosauros投稿を更新して完全なコードを追加しました。私はPythonProgrammingをこのプロジェクトのための私の主なリソースとして、そしてさまざまなStackoverflowの投稿として使用してきました。私が思っている問題は、基本的に、古いボタンと共に全く新しいセットのボタンを作成せずに、各カテゴリーに対応するボタンを作成する 'forループ'を繰り返す必要があるということです。私は、ウィンドウを閉じて、それを開くと、コードは正常に動作します。ご協力ありがとうございました! –

答えて

0

AddTabインスタンスを作成するコードは表示されません。それはどのように呼び出されますか?また、ボタンのコマンドのAddTabにaddnewcategory()関数を持たせる必要があります。このコードでは、クラスの外にあるボタンを1つ追加してその処理を示し、ADDNEWCATEGORYボタンをクリックするたびに新しいボタンを追加します。明らかに、これはあなたの他のコードは含まれていないが、ボタンがどのように動作するかを示しているので、完全ではない。

class AddTab: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.master.minsize(width = 800, height = 480) 
     self.master.maxsize(width = 800, height = 480) 
     self.master.geometry('800x480+0+0') 

     ## separate frame for Add To Category button so 
     ## new buttons can be added to self.frame in order 
     self.cat_button_frame=tk.Frame(self.master) 

     self.label = tk.Label(self.master, text = 'ADD TO CATEGORY') 
     self.label.pack(anchor = 'n') 

     self.frame.pack() 
     self.cat_button_frame.pack() 
     self.but_num=1 
##  catnames = open('categorynames.txt','r').read().splitlines() 

     for name in ['a', 'b', 'c']: 
      addbutton = tk.Button(self.frame, text = '%s-%s ' %(self.but_num, name), 
            width = 20) 
      addbutton.pack() 
      self.but_num += 1 

     addnewcat = tk.Button(self.cat_button_frame, text = 'ADD NEW CATEGORY', 
        width = 100, command = self.addnewcategory) 
     addnewcat.pack(anchor = 's') 

    def addnewcategory(self): 
     """ for simplicity, new category is named "new cat" 
      and the button is not connected to any function 
     """ 
     tk.Button(self.frame, text = 'new cat-%d' %(self.but_num), width = 20).pack() 
     self.but_num += 1 

master=tk.Tk() 
AT=AddTab(master) 
## add new category from outside the class 
AT.addnewcategory() 
master.mainloop() 
関連する問題