-1

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

4

2 回答 2

1

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

top.after(4000, top.destroy)

它直接引用函数 top.destroy 。

于 2017-09-12T08:03:25.473 回答
0

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

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

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

于 2017-09-12T08:05:41.340 回答