Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在关闭其他窗口后更新Tkinter中的窗口:Python 3.5_Python_Python 3.x_Tkinter_Tk - Fatal编程技术网

如何在关闭其他窗口后更新Tkinter中的窗口:Python 3.5

如何在关闭其他窗口后更新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

我正在尝试为一个学校项目创建一个库存系统。它应该允许人们将食物输入到他们创建的类别中

我很难刷新列出可以添加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

我在互联网上搜索到的很多东西都说,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循环”,即创建与每个类别对应的按钮,而不需要创建一组全新的按钮以及旧按钮。如果我关闭窗口并重新打开它,代码工作正常。谢谢你的帮助!