python顶级即使在root被杀死后也会运行
我在下面包含了一些基本代码,它会生成一个框架,然后生成一个顶层来销毁自己。第二个在第一个被销毁后创建 运行此应用程序时,当第一个顶级正在等待时,如果单击主窗口上的“X”,它将终止自身和顶级,但随后将创建第二个顶级以及通用Tk()。关闭后,我收到一个错误:python顶级即使在root被杀死后也会运行,python,tkinter,toplevel,Python,Tkinter,Toplevel,我在下面包含了一些基本代码,它会生成一个框架,然后生成一个顶层来销毁自己。第二个在第一个被销毁后创建 运行此应用程序时,当第一个顶级正在等待时,如果单击主窗口上的“X”,它将终止自身和顶级,但随后将创建第二个顶级以及通用Tk()。关闭后,我收到一个错误:\u tkinter.TclError:无法调用“wm”命令:应用程序已被销毁 我尝试过使用root.destroy()、quit()和os.\u exit(),但这些都不能完全停止应用程序。在根窗口被销毁后,如何完全停止任何脚本的运行 from
\u tkinter.TclError:无法调用“wm”命令:应用程序已被销毁
我尝试过使用root.destroy()
、quit()
和os.\u exit()
,但这些都不能完全停止应用程序。在根窗口被销毁后,如何完全停止任何脚本的运行
from tkinter import *
class Application(Frame):
def __init__(self,master):
Frame.__init__(self,master)
self.L1 = Label(root,text='Hi!')
self.L1.pack()
def Window1():
Wind1 = Toplevel()
Wind1.geometry('100x100+100+100')
Wind1.B1 = Button(Wind1,text='Close',command=Wind1.destroy)
Wind1.B1.pack()
Wind1.lift(aboveThis=root)
Wind1.wait_window()
def Window2():
Wind2 = Toplevel()
Wind2.geometry('100x100+100+100')
Wind2.B2 = Button(Wind2,text='Close',command=Wind2.destroy)
Wind2.B2.pack()
Wind2.lift(aboveThis=root)
Wind2.wait_window()
def Close_Window():
root.destroy()
root = Tk()
root.geometry('100x100+50+50')
root.protocol('WM_DELETE_WINDOW',Close_Window)
app = Application(root)
Window1()
Window2()
root.mainloop()
错误的确切原因是由两个问题引起的。一个是由于
wait\u window()
方法,启动时没有创建两个窗口。另一个问题是缺少为Toplevel()
windows定义的父级
看看下面修改的代码。(请注意,此代码仍需要一些工作,但需要更改以修复错误)
我想把所有的东西都搬到一个教室里会让你受益更多。通过这种方式,您可以使用类属性来管理应用程序中的所有数据,包括从Toplevel()
widgets获取的数据
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.geometry('100x100+50+50')
self.protocol('WM_DELETE_WINDOW', self.close_window)
self.L1 = tk.Label(self, text='Hi!')
self.L1.pack()
tk.Button(self, text="Window 1", command=self.window1).pack()
tk.Button(self, text="Window 2", command=self.window2).pack()
def window1(self):
wind1 = tk.Toplevel(self)
wind1.geometry('100x100+100+100')
wind1.B1 = tk.Button(wind1, text='Close', command=wind1.destroy).pack()
def window2(self):
wind2 = tk.Toplevel(self)
wind2.geometry('100x100+100+100')
wind2.B2 = tk.Button(wind2, text='Close', command=wind2.destroy).pack()
def close_window(self):
self.destroy()
app = Application()
app.mainloop()
我在这里看到一些问题。首先,您没有告诉
Toplevel()
窗口它们的父窗口是什么。它们必须是这样的Wind1=Toplevel(root)
。其次,您的代码中显示的wait\u window()
是导致此行为的原因。调用Window1()
时,程序正在等待窗口关闭,然后再执行下一个命令。我认为这段代码需要重新编写。你到底想做什么?在我正在编写的一个更详细的应用程序中,我创建了Toplevel()
,其中包含一个输入表单,供用户输入数据,该表单将在主窗口上使用。我已经设置了wait_window()
,以防止第二个Toplevel()
与第一个同时运行。我只是试图涵盖用户可以关闭应用程序的所有基本情况。我在代码中添加了第二个示例,为您提供了一个更干净、更可靠的类。
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.geometry('100x100+50+50')
self.protocol('WM_DELETE_WINDOW', self.close_window)
self.L1 = tk.Label(self, text='Hi!')
self.L1.pack()
tk.Button(self, text="Window 1", command=self.window1).pack()
tk.Button(self, text="Window 2", command=self.window2).pack()
def window1(self):
wind1 = tk.Toplevel(self)
wind1.geometry('100x100+100+100')
wind1.B1 = tk.Button(wind1, text='Close', command=wind1.destroy).pack()
def window2(self):
wind2 = tk.Toplevel(self)
wind2.geometry('100x100+100+100')
wind2.B2 = tk.Button(wind2, text='Close', command=wind2.destroy).pack()
def close_window(self):
self.destroy()
app = Application()
app.mainloop()