我是python的新手。我正在使用python 2.7。我想让messagebox每50秒通知我一次。 当我写这篇文章时:
import sys
import time
import threading
if sys.version_info < (3,0):
import Tkinter as tkinter
import tkMessageBox as mbox
else:
import tkinter
import tkinter.messagebox as mbox
window = tkinter.Tk()
window.wm_withdraw()
def loop():
threading.Timer(20.0, loop).start()
mbox.showinfo('my app',time.ctime())
loop()
但是当我按OK应用冻结时。我做错了什么?
答案 0 :(得分:2)
您忘了拨打window.mainloop()
。
此方法触发窗口小部件的主循环,该循环处理事件,并允许与窗口小部件及其子窗口进行交互。
此外,您应该使用after
窗口小部件方法而不是其他计时器。
此方法允许您安排对方法的调用。
您可以查看this post以获得有关after
方法的更完整说明。
以下代码使用loop
方法实现after
函数,并通过调用window.mainloop()
来运行主循环。
def loop(root):
mbox.showinfo('my app',time.ctime())
root.after(50000, lambda: loop(root))
window = tkinter.Tk()
window.wm_withdraw()
loop(window)
window.mainloop()
请注意,loop
函数将小部件作为参数,即window
。
这是必需的,因为需要在窗口小部件上调用after
方法。
此外,after
方法将回调作为第二个参数,我发现将其作为lambda
函数传递更容易。
后者等于调用root.after(50000, f)
,其中f
由def f(): return loop(root)
定义。