Как обновить графический интерфейс при использовании .after? - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь создать игру, похожую на кликер, на практике, используя tkinter. Я очень новичок в tkinter, поэтому я прошу прощения, если вопрос очень простой. У меня есть кнопка, настроенная для добавления к количеству кликов, и я также пытаюсь настроить функцию автоматического клика. Проблема с моим кодом заключается в том, что количество нажатий обновляется только при нажатии кнопки, а не каждую секунду, как предполагалось. Я получаю сообщение об ошибке, пытаясь использовать label1.config (text = str (click)) сразу после master.after (1000, autoClick). Есть ли другой способ заставить графический интерфейс обновляться каждую секунду?

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 Ответ

1 голос
/ 02 апреля 2019

Ошибка связана с тем, что вы вызываете 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...