【问题标题】:Python 3 tkinter destroy all child windows at exit of rootPython 3 tkinter 在根退出时销毁所有子窗口
【发布时间】:2019-12-03 00:58:10
【问题描述】:

所以我已经为此工作了一段时间,我只是不知道我做错了什么。我有一个主窗口我的“根”,但我也有一个“帮助菜单”。现在,当您关闭根帮助菜单时,如果您打开它,它将保持打开状态。我希望在根目录关闭时关闭帮助菜单。

我已经尝试从我的程序中删去所有我认为不会影响情况的代码行,但如果它仍然很长,请原谅我。

    import atexit
    from tkinter import *

    root = Tk()

    def quit():
        helpmenu.destroy()

    atexit.register(quit)

    def helpmenu():
        helpmenu = Tk()
        helpmenu.geometry('800x600')
        helpmenu.title('Help')
        help_Label = Label(helpmenu, text='Welcome to the Boring Program!')
        help_Label.pack()



    class GUI(object):
        def __init__(self, master):
            self.master = master

            def activateCheck1():
                if c1Var.get() == 1:          #whenever checked
                    c3.config(state=NORMAL)
                elif c1Var.get() == 0:        #whenever unchecked
                    c3.config(state=DISABLED)

            def activateCheck2():
                if c2Var.get() == 1:          #whenever checked
                    c4.config(state=NORMAL)
                elif c2Var.get() == 0:        #whenever unchecked
                    c4.config(state=DISABLED)

            c1Var = IntVar()
            c2Var = IntVar()
            c1_Label = Label(root, text="Select Which Edges to Program")
            c1_Label.grid(row=2, columnspan=2)
            c1 = Checkbutton(root, text="Left Edge", variable=c1Var, command=activateCheck1)
            if parser.get('CONFIGURATION', 'LeftEdgeProgram') == '1':
                c1.select()
            c1.grid(row=3, column=0)
            c2 = Checkbutton(root, text="Right Edge", variable=c2Var, command=activateCheck2)
            if parser.get('CONFIGURATION', 'RightEdgeProgram') == '1':
                c2.select()
            c2.grid(row=3, column=1)

            c3Var = IntVar()
            c4Var = IntVar()
            c3_Label = Label(root, text="Select Which Edges to Insert Glue and Dowels")
            c3_Label.grid(row=4, columnspan=2)
            c3 = Checkbutton(root, text="Left Edge", variable=c3Var)
            if parser.get('CONFIGURATION', 'LeftEdgeDowel') == '1':
                c3.select()
            c3.grid(row=5, column=0)
            c4 = Checkbutton(root, text="Right Edge", variable=c4Var)
            if parser.get('CONFIGURATION', 'RightEdgeDowel') == '1':
                c4.select()
            c4.grid(row=5, column=1)

            menubar = Menu(root)
            filemenu = Menu(menubar, tearoff=0)
            filemenu.add_command(label="Print", state='disabled')
            filemenu.add_command(label="Save Configuration", command=save_config)
            filemenu.add_command(label="Help", command=helpmenu)
            filemenu.add_command(label="Restore Defaults", state='disabled')
            filemenu.add_command(label="About", command=restore_config)
            menubar.add_cascade(label="Options", menu=filemenu)

            root.config(menu=menubar)

    myGUI = GUI(root)
    root.mainloop()

【问题讨论】:

    标签: python-3.x tkinter destroy atexit


    【解决方案1】:

    首先,您要创建tk() 窗口的两个实例。几乎不应该创建两个tk() 窗口,这是因为两个tk 窗口无法相互通信。相反,您应该使用TopLevel 窗口。

    您还应该将HelpMenu 更改为继承TopLevel 类的类对象

    这应该看起来像这样:

    class HelpMenu(Toplevel):
        def __init__(self, master, *args, **kwargs):
            super(HelpMenu, self).__init__(master, *args, **kwargs)
            self.geometry('800x600')
            self.title('Help')
            help_Label = Label(self, text='Welcome to the Boring Program!')
            help_Label.pack()
    

    现在唯一需要更改的是工具栏中帮助选项的命令

    类似这样的东西(注意我正在使用 lambda 函数进行此更改):

    filemenu.add_command(label="Help", command= lambda:HelpMenu(self.master) )
    

    这将解决您的问题,因为当 TopLevel 窗口的主窗口关闭时,TopLevel 窗口会自动关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      相关资源
      最近更新 更多