Python 创建两个tkinter窗口,其中一个&x27;闪烁';打开和关闭

Python 创建两个tkinter窗口,其中一个&x27;闪烁';打开和关闭,python,tkinter,Python,Tkinter,我试图创建两个tkinter窗口,一个保持不变(win1),另一个以设定的间隔关闭和重新打开(win2)。最后,我将传递一个坐标列表,供win2迭代,以便每次循环都在不同的位置打开 下面是我用来尝试做这件事的代码。目前我收到了以下错误: _tkinter.TclError: can't invoke "destroy" command: application has been destroyed invalid command name "4349633280&

我试图创建两个tkinter窗口,一个保持不变(win1),另一个以设定的间隔关闭和重新打开(win2)。最后,我将传递一个坐标列表,供win2迭代,以便每次循环都在不同的位置打开

下面是我用来尝试做这件事的代码。目前我收到了以下错误:

_tkinter.TclError: can't invoke "destroy" command:  application has been destroyed
invalid command name "4349633280<lambda>"
while executing
"4349633280<lambda>"
("after" script)

要做到这一点,您不能在没有默认参数的情况下使用lambda,但您根本不需要它。您还应该使用Toplevel而不是Tk来创建附加窗口

import tkinter as tk

tk.NoDefaultRoot() # this seems useless ... 

win1 = tk.Tk()

tk.Button(win1, text='Spam').pack()
v=[1,2,3,4,5,6]
for i in v:
    win2 = tk.Toplevel(win1)
    win2.after(300, win2.destroy) # close child window in 300 milliseconds

win1.mainloop()

要做到这一点,您不能在没有默认参数的情况下使用lambda,但您根本不需要它。您还应该使用Toplevel而不是Tk来创建附加窗口

import tkinter as tk

tk.NoDefaultRoot() # this seems useless ... 

win1 = tk.Tk()

tk.Button(win1, text='Spam').pack()
v=[1,2,3,4,5,6]
for i in v:
    win2 = tk.Toplevel(win1)
    win2.after(300, win2.destroy) # close child window in 300 milliseconds

win1.mainloop()

实际上,您几乎同时创建了六个窗口,然后安排了六个任务来销毁它们。但是,您对六个窗口使用相同的变量
win2
,因此
win2
最终只引用最后一个窗口。执行第一个调度任务时,
win2
被销毁。当执行第二个调度任务时,它尝试销毁
win2
,但它已被销毁,从而导致异常

对于
win2
,您还应该使用
Toplevel
。建议不要有多个
Tk()
实例

下面是使用
after()
执行所需操作的示例:

将tkinter作为tk导入
win1=tk.tk()
tk.Button(win1,text=“Spam”).pack()
def闪烁_窗口(win2=None,n=6):
如果win2:
win2.destroy()
如果n>0:
win2=tk.Toplevel()
win2.after(300,闪烁窗口,win2,n-1)
闪烁窗口()
win1.mainloop()

实际上,您几乎同时创建了六个窗口,然后安排了六个任务来销毁它们。但是,您对六个窗口使用相同的变量
win2
,因此
win2
最终只引用最后一个窗口。执行第一个调度任务时,
win2
被销毁。当执行第二个调度任务时,它尝试销毁
win2
,但它已被销毁,从而导致异常

对于
win2
,您还应该使用
Toplevel
。建议不要有多个
Tk()
实例

下面是使用
after()
执行所需操作的示例:

将tkinter作为tk导入
win1=tk.tk()
tk.Button(win1,text=“Spam”).pack()
def闪烁_窗口(win2=None,n=6):
如果win2:
win2.destroy()
如果n>0:
win2=tk.Toplevel()
win2.after(300,闪烁窗口,win2,n-1)
闪烁窗口()
win1.mainloop()

“您不能使用lambda”是错误的陈述。不需要它,但仍然可以使用它。谢谢你的回答。这并没有达到我想要的闪烁效果。当我运行此命令时,所有6个子窗口立即出现,并在300毫秒后全部关闭。我希望在代码运行的整个过程中显示win1,同时win2打开、保持打开n毫秒、关闭,然后在循环中重新打开6次。我不认为使用子窗口可以做到这一点,因为mainloop()有效地冻结了代码。这就是为什么我试图使用tk.NoDefaultRoot()使这两个窗口彼此独立。再次感谢您,如果您找到了解决方案,请告诉我。@BryanOakley ok,已编辑。@EvanLawrence我只是告诉您如何解决您的这一个问题,我并不是要解决您的整个作业。从这里开始。是的,应该使用顶级子窗口来完成,不,tk.NoDefaultRoot()不会使窗口“独立”。“您不能使用lambda”是错误的语句。不需要它,但仍然可以使用它。谢谢你的回答。这并没有达到我想要的闪烁效果。当我运行此命令时,所有6个子窗口立即出现,并在300毫秒后全部关闭。我希望在代码运行的整个过程中显示win1,同时win2打开、保持打开n毫秒、关闭,然后在循环中重新打开6次。我不认为使用子窗口可以做到这一点,因为mainloop()有效地冻结了代码。这就是为什么我试图使用tk.NoDefaultRoot()使这两个窗口彼此独立。再次感谢您,如果您找到了解决方案,请告诉我。@BryanOakley ok,已编辑。@EvanLawrence我只是告诉您如何解决您的这一个问题,我并不是要解决您的整个作业。从这里开始。是的,应该使用顶级子窗口完成,不,tk.NoDefaultRoot()不会使窗口“独立”。谢谢,这非常有用!谢谢,这很有帮助!