Проблемы с update и update_idletasks - PullRequest
0 голосов
/ 30 апреля 2020

Я изучал python уже месяц и столкнулся с моей первой кирпичной стеной. У меня есть программа для просмотра больших художественных приложений GUI, и в какой-то момент я хочу вывести изображение на экран с обратным отсчетом примерно каждые 5 секунд. Я подумал о коде, подобном приведенному ниже. Проблема в том, что он использует обновление, и все мои чтения говорят, что обновление плохое (запускает новое событие l oop (?)) И что я должен использовать update_idletasks. когда я заменяю update на update_idletasks в коде под кнопкой обратного отсчета, она не видна, пока не достигнет единичных цифр, обновление внешне работает нормально. Но также ключ с привязкой q вызывает подпрограмму, но не имеет эффекта

from tkinter import *
import sys
import time

root = Tk()

def q_key(event):
    sys.exit()

frame=Frame(root, padx=100, pady=100, bd=10, relief=FLAT)
frame.pack()
button=Button(frame,relief="flat",bg="grey",fg="white",font="-size 18",text="60")
button.pack()
root.bind("q",q_key)

for x in range(30, -1, -5) :
   button.configure(text=str(x))
   button.update()
   print(x)
   button.after(5000)

root.mainloop()

1 Ответ

1 голос
/ 30 апреля 2020

В этом случае вам не нужно ни update, ни update_idletasks. Вам также не нужен l oop, потому что tkinter уже запущен в al oop: mainloop.

Вместо этого переместите тело l oop в функцию и вызовите функция через after. Что происходит, так это то, что вы выполняете любую работу, которую хотите делать, а затем планируете, чтобы ваша функция снова запускалась после задержки. Поскольку ваша функция завершается, tkinter возвращается к событию l oop и может обрабатывать события как обычно. Когда задержка истекает, tkinter вызывает вашу функцию, и весь процесс начинается заново.

Это выглядит примерно так:

def show(x):
    button.configure(text=x)
    if x > 0:
        button.after(5000, show, x-5)

show(30)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...