簡體   English   中英

關閉其他窗口后如何在Tkinter中更新窗口:Python 3.5

[英]How to update a window in Tkinter after closing other window: 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')

這段代碼完成了mainloop switchy switchy的工作。

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。

我在互聯網上搜索到的很多內容都表明mainloop會進行“事件處理”或更新。 我不太確定這意味着什么,特別是如果我看到的許多程序都在__init__包含了所有“部件”。

我正在嘗試自己學習Python,並且進展順利。 其中大部分可能是不好的(糟糕的)編程,但不是什么,但這是我第一次嘗試編程,我願意學習。

如果有人想看完整的代碼,我也可以發布它。

編輯:

這是要求的完整代碼:

    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()

SubTab基本上可以被忽略,因為它基本上是AddTab的副本。

您不會顯示創建AddTab實例的代碼。 怎么稱呼呢? 您還必須在AddTab中具有addnewcategory()函數,以供按下按鈕時使用。 這段代碼從班級外部添加了一個按鈕來顯示其完成方式,並且每次您單擊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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM