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

时间:2019-04-02 01:38:42

标签: python tkinter

我正在尝试使用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"

1 个答案:

答案 0 :(得分:1)

该错误是由于您在创建autoClick()之前调用了label1。只需将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)