Строка выполняется после цикла, хотя стоит раньше

Есть функция, выполняющая определенный цикл. Ее побочным эффектом должно быть изменение цвета кнопки. При вызове функции кнопка меняет цвет ПОСЛЕ завершения цикла, хотя стоит выше. Вопрос: как это работает? Например:

def destiny(event):
    global go                           #добавил на случай проблемы с простр-м имен
    clock = 68468
    go.configure(background='#aaaaaa')  #меняем цвет тут
    start = int(time.time())
    end = int(start + (clock * 60))
    while True:
        stop = int(time.time())
        if stop == end:
            print('Hello, world')
            break

Похоже, ошибки тут нет, но есть неочевидная логика. З.Ы.: с вашего позволения, импорты, объявление окна, кнопки и пр. я опущу


Ответы (1 шт):

Автор решения: CrazyElf

Если эта функция выполняется по событию GUI, то другие события GUI не будут обработаны, пока ваша функция не окончится. Вы тормозите цикл обработки событий GUI вашей долгой обработкой события, поэтому ничего и не обновляется. GUI обычно однопоточен и выполняется в основном потоке приложения (хотя если это tkinter, то наверное он выполняется в своём отдельном потоке, но не суть).

Если вы хотите, чтобы какой-то долгий процесс выполнялся в обработчике события GUI, вы должны запустить его отдельным потоком и как можно быстрее завершить обработку события. Причём, если речь о tkinter, то у него там есть свои какие-то потоки специальные, нужно, наверное, использовать их, а не обычные потоки питона.

Хотя по-хорошему нужно всё-таки больше информации о вашем коде. Но в общих чертах работа всех GUI и обработка ими событий примерно одинаковы - это один поток, который обрабатывает очередь событий. И пока текущее событие не завершилось, другие события (включая отрисовку тех обновлений интерфейса, которые вы сделали) не будут выполнены.

→ Ссылка