Рейтинг@Mail.ru

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.

общие вопросы, прикладное, Программирование , ,

Пожалуйста, оцените полезность и качество данной статьи. Одна звезда - плохо, 5 - хорошо.
1 звезда2 звезды3 звезды4 звезды5 звёзд (2 голосов, средний: 5,00 из 5)
Loading ... Loading ...

  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.
*