如何在使用 .after 时更新 GUI?

Posted

技术标签:

【中文标题】如何在使用 .after 时更新 GUI?【英文标题】:How to update the GUI using while using .after? 【发布时间】:2019-04-02 01:38:41 【问题描述】:

我正在尝试使用 tkinter 创建一个类似于游戏的答题器作为练习。我对 tkinter 很陌生,所以如果问题非常基本,我深表歉意。我设置了一个按钮来增加点击次数,我还试图设置一个自动点击功能。我的代码的问题是点击次数仅在单击按钮时更新,而不是按预期每秒更新。尝试在 master.after(1000,autoClick) 之后直接使用 label1.config(text=str(click)) 时出现错误。还有其他方法可以让 GUI 每秒更新一次吗?

from tkinter import *
import time

click = 0


master = Tk()

def onClick():
    global master
    global click
    click += 1
    label1.config(text=str(click))

def autoClick():
    global master
    global click
    click += 1
    master.after(1000,autoClick)
    label1.config(text=str(click))


autoClick()


label1=Label(master, text=str(click))
label1.pack()

clickButton = Button(master, text = "click", command = onClick)
clickButton.pack()

mainloop()

print(click)

错误信息


  File "D:\Anaconda\lib\tkinter\__init__.py", line 1476, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))

TclError: invalid command name ".!label"

【问题讨论】:

您在创建label1 之前调用该函数。在 mainloop() 之前移动 autoclick 函数 【参考方案1】:

该错误是由于您在创建label1 之前调用了autoClick()。只需将autoClick() 移动到mainloop() 之前。

另外,您可以将onClick()autoClick() 组合为一个功能,以同时支持自动和手动点击,如下所示:

from tkinter import *

click = 0

def updateClick(auto=False):
    global click
    click += 1
    label1.config(text=click)
    if auto: label1.after(1000, updateClick, True)

master = Tk()

label1=Label(master, text=click)
label1.pack()

clickButton = Button(master, text="click", command=updateClick)
clickButton.pack()

updateClick(True) # start the auto click task

mainloop()

print(click)

【讨论】:

以上是关于如何在使用 .after 时更新 GUI?的主要内容,如果未能解决你的问题,请参考以下文章

如何在处理时更改 GUI

如何在 qt creator 的 main.cpp 中有一个计时器,以便在单击按钮时更新 GUI?

如何在 GUI pyqt 中更新热图的颜色条?

使用 after_save 更新所有 belongs_to 记录

如何从另一个线程更新 GUI?

如何从另一个线程更新 GUI?