@oxidizerby

Странная не последовательная работа функции в tkinter python?

Странное не последовательное поведение функции по событию при нажатии кнопки в tkinter.
При нажатии кнопки я ожидаю что сработает print(1).
Затем текст в label1 поменяется на указанный.
И затем отработает print(2)
Но почему то текст в label1 меняется последним.
Почему так происходит и как это исправить?

import tkinter as tk
from time import sleep

def run():
    print(1)
    label1['text'] = 'Но он меняется после sleep и print(2) и print(3)'
    print(2)
    sleep(5) # Для наглядности
    print(3)

root = tk.Tk()
root.geometry("400x100")

label1 = tk.Label(text="После нажатия кнопки здесь должен поменяться текст сразу же")
btn = tk.Button(text="OK", command=run)
label1.grid(row=0, column=0)
btn.grid(row=1, column=0)

root.mainloop()
  • Вопрос задан
  • 108 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Потому что перерисовка окна - это отдельное событие. Когда ты изменяешь текст метки, она помечает своё окно как нуждающееся в перерисовке. Да, каждый элемент управления - это тоже окно. Это идёт из нижележащего оконного менеджера, и под виндой, и под никсами. Это сделано, чтобы не перерисовывать окно двести раз, если ты делаешь серию изменений в интерфейсе.
Эта перерисовка будет выполнена после того, как закончит выполняться твой обработчик события.
Ты можешь попробовать вызвать label1.update_idletasks() после изменения текста, чтобы попросить tkinter перерисовать окно немедленно.
Ответ написан
@oxidizerby Автор вопроса
Подошло решение от @Vindicar
Только немного изменил в моём случае лучше использовать root.update()
Изменил функцию так:
def run():
    print(1)
    label1['text'] = 'Но он меняется после sleep и print(2) и print(3)'
    root.update() # Вот эта строка решает проблему!
    print(2)
    sleep(5) # Для наглядности
    print(3)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы