2017-09-12 53 views
-1

我希望此代码创建一个弹出窗口,它在4秒后破坏自己,但也可以通过按钮关闭。Python关闭Toplevel窗口错误

def error(self): 
    top = Toplevel() 
    top.after(4000, lambda: top.destroy()) 
    center_window(300,100, top) 
    top.title("Error") 
    Label(top, text="Please enter a valid code", height=3, width=200).pack() 
    ok = Button(top, text="OK", command=top.destroy) 
    ok.pack() 
    ok.bind("<Return>", lambda a: top.destroy()) 
    ok.focus_set() 

我已经运行的代码,它工作的时间细90%,除了有时它抛出这个错误:

TypeError: <lambda>() takes exactly 1 argument (0 given) 

我已经做了研究,指出它是Tkinters线程。我不确定这是否是我的问题,但当我拿出这行代码:

top.after(4000, lambda: top.destroy()) 

它似乎工作。如果有人能帮助我,我已经自学了我所了解的python,所以我确信我的学习存在漏洞。我想我可能需要以某种方式使用主执行线程来销毁这个窗口,或者创建我自己的自定义窗口小部件。任何帮助表示赞赏。

+0

这与线程完全没有关系。 Tkinter始终以单线程运行。 –

回答

1

使用after或bind时,不需要使用lambda。 例如,使用:

top.after(4000, top.destroy) 

它直接引用函数top.destroy。

0

您可以直接绑定函数的调用,而不是使用Lambda:

top.after(4000, top.destroy) 
... 
    ok.bind("<Return>", top.destroy) 

你会使用lambda,举例来说,如果你需要的参数传递给函数;这里并不是这种情况。