Python приоритет команд Tkinter - PullRequest
0 голосов
/ 04 мая 2020

Я столкнулся со странной проблемой в моей программе.

from tkinter import *
import time 


class Window:
    def __init__(self):
        self.root = Tk()
        self.root.title('Test')
        self.root.geometry('400x500')
        self.root.resizable(FALSE, FALSE)
        self.root.configure(bg ='#1A181B')

    def draw_widgets(self):
        Button(self.root, text='Start', font='Verdana 17',command = self.start_bot).grid(row=1, column=1)

    def run(self):
        self.draw_widgets()
        self.root.mainloop()

    def start_bot(self):
        Button(self.root, text='Start', font='Verdana 17', command=self.start_bot).grid(row=2, column=1)
        time.sleep(4)
        print('a')


win = Window()
win.run()
win.draw_widgets()

Как вы можете видеть после нажатия кнопки, я хочу создать еще одну кнопку, затем подождать 4 секунды, затем напечатать «a», но это делает другое: 1) Ожидание в течение 4 секунд 2) Печать 'a' 3) Создание кнопки.

Пожалуйста, как я могу это исправить, мне действительно нужна ваша помощь.

1 Ответ

1 голос
/ 04 мая 2020

Когда вы используете time.sleep(), приложение приостанавливает обработку до окончания периода времени. Это включает в себя обновление GUI изменений. Чтобы изменения вступили в силу до запуска режима сна, вы должны указать приложению сделать это с помощью update_idletasks(). Смотрите пример:

def start_bot(self):
    Button(self.root, text='Start', font='Verdana 17',
           command=self.start_bot).grid(row=2, column=1)
    self.root.update_idletasks()    # Update GUI changes
    time.sleep(4)
    print('a')

Посмотрите на функцию after(), которая не приостанавливает обработку, но планирует что-то на более позднее время. Это часто может быть хорошей функцией для использования вместо сна.

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