【问题标题】:Periodic message Box in pythonpython中的定期消息框
【发布时间】:2017-09-04 11:19:25
【问题描述】:

我是 python 新手。我正在使用python 2.7。我想让消息框每 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 应用程序冻结。我做错了什么?

【问题讨论】:

标签: python tkinter


【解决方案1】:

你忘了打电话给window.mainloop()。 此方法触发小部件的主循环,该循环处理事件,并允许与小部件及其子级交互。

此外,您应该使用after 小部件方法而不是其他计时器。 此方法允许您安排对方法的调用。 您可能想查看this post 以获得对after 方法的更完整说明。

以下代码通过after方法实现loop函数,并通过调用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)定义。

【讨论】:

  • 批准了这个答案。你能告诉我在哪里可以看到“threading.Timer vs after method”
  • @VladimirYanakiev 我不确定是否有任何明确的原因反对 threading.Timer,但由于tkinter 提供了一种处理调度的方法,它应该用于为了统一。您使用的模块越少,您期望的跨函数的稳定性和兼容性就越高。
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多