python

时间:2017-09-04 11:19:25

标签: python tkinter

我是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应用冻结时。我做错了什么?

1 个答案:

答案 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),其中fdef f(): return loop(root)定义。