我希望此代码能够创建一个弹出窗口错误窗口,该窗口在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的了解,所以我确信我的学习中存在漏洞。我想我可能需要以某种方式使用执行的主线程来销毁这个窗口,否则创建我自己的自定义小部件。任何帮助表示赞赏。
答案 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;这不是这种情况。