【问题标题】:Python timer that doesn't pause the whole program不会暂停整个程序的 Python 计时器
【发布时间】:2022-01-06 21:55:43
【问题描述】:

我正在尝试为一个简单的游戏制作一个模式,您可以在其中使用 tkinter 捕捉掉落的物品。

在此模式下,您有 60 秒的时间捕捉尽可能多的物品。我尝试过的所有计时器方法都会暂停整个程序

...尝试使用空标签,但 .after 暂停整个程序

timerlabel = tkinter.Label(text="")
def timer():
    global t, timerdisplay
    while t > 0:
        t -= 1
        timerlabel.after(1000)
        c.delete(timerdisplay)
        timerdisplay = c.create_text(200, 12, text=t)
        c.update()

知道怎么做吗?

【问题讨论】:

  • 你需要传递一个函数给.after();时间一到就可以打电话。例如:timerlabel.after(1000, some_func).
  • 并且不要每次都删除/重新创建标签。 timerdisplay.config( text=t ) 将更新现有控件。
  • 你需要使用线程
  • @GabeMorris -- 不,他们没有。线程不是每秒一次的计时器的答案,您不能从线程更新 UI。事件就是答案,使用.after()
  • @GabeMorris:他们绝对不需要线程来解决这么简单的问题。

标签: python tkinter time timer


【解决方案1】:

这是更好的方法,特别是因为after(n) 在给定的时间段内冻结程序。创建一个接受数字并显示该数字的函数。然后,它减一,然后重新安排自己在未来运行一秒,直到数字变为零。

def timer(t):
    global timerdisplay
    c.delete(timerdisplay)
    timerdisplay = c.create_text(200, 12, text=t)
    if t >= 1:
        c.after(1000, timer, t-1)
timer(timerdisplay, 10)

为了优化这一点,您可以将画布项目与数字一起传递。您也可以只重新配置文本项,而不是删除和恢复它。

def timer(timerdisplay, t):
    c.itemconfigure(timerdisplay, text=t)
    if t >= 1:
        c.after(1000, timer, timerdisplay, t-1)
timerdisplay = c.create_text(200, 12)
timer(timerdisplay, 10)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多