[英]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.