Как обновить окно tkinter, прежде чем перейти к mainloop ()

#python #tkinter

#python #tkinter

Вопрос:

У меня есть файл python, который содержит:

 from tkinter import *
from tkinter.scrolledtext import ScrolledText
import time

root = Tk()
scroll_text = ScrolledText(root)
scroll_text.pack()

def task0():
    time.sleep(5) # some code which takes 5 secs
    pass
def task1():
    # some code which takes a few seconds
    pass
def task2():
    # some code which takes a few seconds
    pass
# ...

for i in range(0, 5):
    scroll_text.insert(INSERT, 'program start to do task{0}n'.format(i))

    if i == 0:
        task0()
    elif i == 1:
        task1()
    elif i == 2:
        task1()
# ...
    
print('Finish')
        
root.mainloop()
 

Я ожидаю, что при запуске программы сразу же появится program start to do task .. текст в tkinter окне и после этого начнется выполнение функций, каждая из которых длится несколько секунд.
Что я должен сделать, чтобы события происходили в том же порядке, что и код, который я написал (т. Е. Сначала Показать номер задачи program start to do task .. , чтобы показать пользователю ход выполнения программы в tkinter окне, а затем выполнить функции).

Комментарии:

1. Вы проводили какие-либо исследования? На этом сайте много вопросов, связанных с отложенным обновлением экрана в tkinter. Это очень распространенная проблема.

2. @BryanOakley Я обновил ответ, чтобы лучше представить проблему.

Ответ №1:

TKinter не обновляет окно, потому что запуск mainloop() заблокирован вашим циклом. Решение зависит от того, какую реальную проблему вы пытаетесь решить, что неясно из пустого цикла. Если вы просто пытаетесь создать 5-секундную задержку, используйте метод after() tkinter, чтобы запланировать выполнение вашей команды print() позже, не блокируя mainloop() до тех пор.

Комментарии:

1. Ответ тот же. Tkinter не обновляет окно, потому что основной цикл не достигнут, пока Python запускает sleep () или любой другой блокирующий код, который должен обозначать «некоторый код, который занимает несколько секунд». Вам нужно запланировать задачи с помощью root.after(), если вы хотите, чтобы окно появлялось во время выполнения другого кода.

Ответ №2:

Ваше окно не создается до root.mainloop() тех пор, пока не будет выполнено. Ваши программы сначала ожидают, а затем создают окно. Что вы можете сделать, так это добавить эту строку:

 root.after(5000,lambda: print('Finish'))
 

Через 5 секунд (5000 миллисекунд) он вызовет lambda функцию, которая будет печатать.

Комментарии:

1. Я не хочу делать паузу в течение 5 секунд. Я обновил вопрос, чтобы, возможно, вы могли лучше понять смысл.