Python 3 tkinter 在 root 退出时销毁所有子节点 windows
Python 3 tkinter destroy all child windows at exit of root
所以我已经为此工作了一段时间,我只是不知道我做错了什么。我有一个主要 window 我的 'root' 但我也有一个 'helpmenu'。现在,当您关闭根帮助菜单时,如果您打开它,它将保持打开状态。我希望帮助菜单在 root 关闭时关闭。
我已经尝试删除我的程序中的所有代码行,我认为这对情况没有影响,但如果它仍然很长,请原谅我。
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()
首先,您要创建 tk()
windows 的两个实例。创建两个 tk()
windows 几乎不应该这样做,这是因为两个 tk
windows 无法相互通信。相反,您应该使用 TopLevel
window.
您还应该将 HelpMenu
更改为继承 TopLevel
Class
的 class 对象
这应该看起来像这样:
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
window 的主 window 关闭时,TopLevel
window 会自动关闭。
所以我已经为此工作了一段时间,我只是不知道我做错了什么。我有一个主要 window 我的 'root' 但我也有一个 'helpmenu'。现在,当您关闭根帮助菜单时,如果您打开它,它将保持打开状态。我希望帮助菜单在 root 关闭时关闭。
我已经尝试删除我的程序中的所有代码行,我认为这对情况没有影响,但如果它仍然很长,请原谅我。
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()
首先,您要创建 tk()
windows 的两个实例。创建两个 tk()
windows 几乎不应该这样做,这是因为两个 tk
windows 无法相互通信。相反,您应该使用 TopLevel
window.
您还应该将 HelpMenu
更改为继承 TopLevel
Class
这应该看起来像这样:
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
window 的主 window 关闭时,TopLevel
window 会自动关闭。