Python: Проблема с подвисанием GUI на TkInter.
Встала задача написания небольшой графической оболочки для программы с минимальным интерфейсом (одна кнопка и одно поле вывода). Много нам не надо, поэтому решил обойтись идущей вместе с python’ом в поставке библиотекой TkInter. И тут столкнулся с небольшой проблемой — при нажатии кнопки запускаются довольно долгие и объёмные вычисления, из-за которых виснет весь интерфейс программы.
Решений у этого вопроса несколько.
1 — Запускать эти вычисления в отдельном потоке, что меня вполне устроило:
# -*- coding: utf-8 -*- from Tkinter import * import threading, time class AppGUI: def __init__(self): self.tk = Tk() frame = Frame(self.tk) frame.pack() Button(frame, text="Compute", command=self.computeWithGUIAntifreeze).pack() def run(self): self.tk.mainloop() def computeWithGUIAntifreeze(self): """ Метод-прокладка для запуска в новом потоке вычислений """ threading.Thread(target=self.compute).start() def compute(self): """" Тут как раз и происходят длительные вычисления """" time.sleep(15) gui = AppGUI() gui.run()
2 — Использовать время от времени методы:
- Tk.update();
- Tk.update_idletasks() — только обновляет окна, но не вызывает обработку событий, сгенерированных пользователем, в отличие от Tk.update();
Использовать эти методы стоит с осторожностью, дабы не возникло неприятных ситуаций (подробнее в документации). Таково предостережение официальной документации.
Ссылки к посту:
http://www.tcl.tk/man/tcl8.5/TclCmd/update.htm — официальная документация по Tcl/Tk.


Последние комментарии