Главная > общие вопросы, прикладное, Программирование > Python: Проблема с подвисанием GUI на TkInter.

Python: Проблема с подвисанием GUI на TkInter.

Встала задача написания небольшой графической оболочки для программы с минимальным интерфейсом (одна кнопка и одно поле вывода). Много нам не надо, поэтому решил обойтись идущей вместе с python’ом в поставке библиотекой TkInter. И тут столкнулся с небольшой проблемой – при нажатии кнопки запускаются довольно долгие и объёмные вычисления, из-за которых виснет весь интерфейс программы.

Решений у этого вопроса несколько.

1. Запускать эти вычисления в отдельном потоке, что меня вполне устроило:

# -*- coding: utf-8 -*-

import threading
import time

from Tkinter import *

class AppGUI(object):
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();

Использовать эти методы стоит с осторожностью, дабы не возникло неприятных ситуаций (подробнее в документации). Таково предостережение официальной документации.

Пожалуйста, оцените полезность и качество данной статьи. Одна звезда - плохо, 5 - хорошо.
1/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.2/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.3/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.4/5.5/5. (2 голосов, средний: 5,00 из 5)
Загрузка...
  1. Аноним
    24 октября 2013 в 16:01 | #1

    Почему если создавать окно ткинтера не через класс, появляется 2-е окно и вся программа подвисает?Потоки не работают(

  2. lizz
    24 октября 2013 в 23:07 | #2

    @Аноним
    Вероятно, вы что-то делаете не так, по сути никакой разницы нет: через класс что-то делать или нет. Ну или как вариант, за 4 года пример устарел и теперь в Tkinter это делается как-то иначе (впрочем, в этом я сомневаюсь).

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