【问题标题】:Update label text periodically from within function从函数内部定期更新标签文本
【发布时间】:2021-12-28 07:24:30
【问题描述】:

下面的代码打开一个 tkinter 窗口,标签显示“0”,当按下按钮时,20 秒后,标签显示“9”。

相反,我尝试定期更新标签,每 2 秒显示 0 到 9 的数字,而不是仅显示 0 和 9。

import tkinter as tk
from tkinter import Label, Button
import time

root = tk.Tk()
label = Label(root, text=0)
label.pack()

def loop():
    for i in range(10):
        time.sleep(2)
        label.config(text=i)

Button(root, text='Press me!',command=loop).pack()

root.mainloop()

提前谢谢你

【问题讨论】:

  • 不要使用time.sleep,也不要使用循环,使用after 来“循环”,这个网站和其他地方有很多关于如何做到这一点的例子
  • 对。重要的是要记住所有 GUI 框架都是事件驱动的。创建或更新 UI 元素时,不会绘制任何内容。那只是发送一个消息。在您返回root.mainloop 之前无法处理该消息。在您的处理程序返回之前,UI 将完全冻结。处理程序需要短暂运行并返回。

标签: python tkinter


【解决方案1】:
def loop():
    for i in range(10):
        root.after(2000, lambda:label.config(text=i))

编辑:

以上只会升级一次。正如@Matiiss 建议的那样,我们可以这样做:

    def loop():
        for i in range(10):
            root.after(2000*(i+1), lambda:label.config(text=i))
        

【讨论】:

  • 不,这会更新 Label 十次,所有更新都在两秒后(因此实际上只有一个更新可见)。他们都会更新 Label 以显示“10”,因为i 将在任何 lambda 实际执行之前达到其最终值。
  • 您的示例可以通过简单地使用root.after(2000 * (i + 1), ...) 来修复,这样每次呼叫都安排在比前一个更长的时间段(2 秒)之后
  • 您需要在lambda中使用默认值的参数,否则所有计划任务将显示相同的文本'9'。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多