Python关闭Toplevel窗口错误

时间:2017-09-12 07:13:10

标签: python python-2.7 tkinter toplevel

我希望此代码能够创建一个弹出窗口错误窗口,该窗口在4秒后会自行销毁,但也可以通过按钮关闭。

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的了解,所以我确信我的学习中存在漏洞。我想我可能需要以某种方式使用执行的主线程来销毁这个窗口,否则创建我自己的自定义小部件。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

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

top.after(4000, top.destroy)

直接引用top.destroy函数。

答案 1 :(得分:0)

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

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

例如,如果需要将参数传递给函数,则可以使用lambda;这不是这种情况。