如何在关闭其他窗口后更新Tkinter中的窗口:Python 3.5
我正在尝试为一个学校项目创建一个库存系统。它应该允许人们将食物输入到他们创建的类别中 我很难刷新列出可以添加1种食物的类别的窗口如何在关闭其他窗口后更新Tkinter中的窗口:Python 3.5,python,python-3.x,tkinter,tk,Python,Python 3.x,Tkinter,Tk,我正在尝试为一个学校项目创建一个库存系统。它应该允许人们将食物输入到他们创建的类别中 我很难刷新列出可以添加1种食物的类别的窗口 class AddTab: def __init__(self, master): self.master = master self.frame = tk.Frame(self.master) self.master.minsize(width = 800, height = 480) self
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
我在互联网上搜索到的很多东西都说,mainloop负责“事件处理”或更新。我不太确定这意味着什么,尤其是如果我见过的许多程序都在\uuuu init\uuuu
中有它们的“小部件”
我正在尝试自己学习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()
子选项卡基本上可以忽略,因为它基本上是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()
我怀疑你的问题不在你发布的任何代码中。
NewCategory
和AddTab
都是Frames
(另外,您应该使用继承…python3c'mon)。您的问题标题所描述的问题(关于“windows”)可能来自于有多个Tk应用程序。调用/构造NewCategory
的代码在哪里?它可能会在某处执行类似于show()
的操作?@Tersosauros我更新了帖子,包含了完整的代码。我一直在使用PythonProgramming作为这个项目的主要资源,以及各种Stackoverflow帖子。我想我遇到的问题是,我基本上需要重复“for循环”,即创建与每个类别对应的按钮,而不需要创建一组全新的按钮以及旧按钮。如果我关闭窗口并重新打开它,代码工作正常。谢谢你的帮助!