python顶级即使在root被杀死后也会运行

python顶级即使在root被杀死后也会运行,python,tkinter,toplevel,Python,Tkinter,Toplevel,我在下面包含了一些基本代码,它会生成一个框架,然后生成一个顶层来销毁自己。第二个在第一个被销毁后创建 运行此应用程序时,当第一个顶级正在等待时,如果单击主窗口上的“X”,它将终止自身和顶级,但随后将创建第二个顶级以及通用Tk()。关闭后,我收到一个错误:\u tkinter.TclError:无法调用“wm”命令:应用程序已被销毁 我尝试过使用root.destroy()、quit()和os.\u exit(),但这些都不能完全停止应用程序。在根窗口被销毁后,如何完全停止任何脚本的运行 from

我在下面包含了一些基本代码,它会生成一个框架,然后生成一个顶层来销毁自己。第二个在第一个被销毁后创建

运行此应用程序时,当第一个顶级正在等待时,如果单击主窗口上的“X”,它将终止自身和顶级,但随后将创建第二个顶级以及通用Tk()。关闭后,我收到一个错误:
\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()