Я собираю приложение tkinter gui и иногда при загрузке нового кадра и добавлении его в записную книжку графический интерфейс зависает при вызове обновления. Я не уверен, что предоставить для кода, у меня много подклассов, поэтому публикация всего этого будет смешной, и я не уверен, будет ли это вообще полезно.
def _handle_events_button(self):
ntbk = self.find_notebook()
print("1: " + str(int(time.time())))
w = EventListDetailsCombo(ntbk)
print("2: " + str(int(time.time())))
w.load()
print("3: " + str(int(time.time())))
w.add_to_notebook(ntbk)
print("4: " + str(int(time.time())))
# clipboard.root.update_idletasks()
print("5: " + str(int(time.time())))
ntbk.select(w)
print("6: " + str(int(time.time())))
Вывод отпечатков выглядит так:
# Working correctly
1: 1555952235
2: 1555952235
3: 1555952235
4: 1555952235
5: 1555952237
6: 1555952237
# Hang / Delay
1: 1555952240
2: 1555952240
3: 1555952240
4: 1555952240
5: 1555952266
6: 1555952266
То есть с update_idletasks () без update_idletasks () все эти выходные данные находятся в пределах 1-2 секунд друг от друга. Вместо этого происходит зависание в mainloop update_idletasks
Некоторые заметки:
- Он не останавливается постоянно, кажется довольно случайным, но, похоже, это происходит каждые 4-5 попыток.
- Продолжительность замораживания также кажется случайной, иногда ее 30 секунд, иногда несколько минут.
- Если я нажму другие кнопки, пока они заморожены, они выполнят эти действия после остановки остановки
- обычно, если я прекращаю приложение из pycharm, кадр загружается за секунду до завершения приложения.
Я не уверен, куда идти отсюда, какие-нибудь указатели на вещи, которые я мог бы изучить?
Edit: Итак, я прошел и удалил все вызовы для обновления, и теперь он просто зависает после этого кода, я предполагаю, что на этапе обновления основного цикла, но я не совсем уверен, как проверить это предположение, эта функция _handle_events_button вызывается непосредственно с кнопки событий, поэтому после этого момента моего кода больше не должно быть.
Редактировать 2: Если я оставлю update_idletasks и запусту на нем профилировщик, то при правильной работе он будет выглядеть так:

На прогонах, где он зависает, все выглядит одинаково, за исключением того, что вместо вызова метода «около 1000 мс» требуется 25000 мс или более с примерно одинаковым количеством вызовов «вызова».
Редактировать 3: я добавил в выводе операторов печати. Также я не могу выбросить любую из этих функций в отдельный поток, так как все это только готовит виджеты.