Как заставить виджет PyGTK быстро реагировать, когда обратный вызов занимает слишком много времени? - PullRequest
0 голосов
/ 27 июня 2011

Я выполняю трудоемкую обработку в функции обратного вызова _init.Поэтому в графическом интерфейсе, когда я активирую кнопку-флажок, программа зависает, пока обработка продолжается до завершения, а затем появляется флажок, и выполнение возобновляется в обычном режиме.

self.init = gtk.CheckButton("Init", False)
self.init.connect("toggled", self._init)

def _init(self, w):
....

Как сделать графический интерфейс более отзывчивым во время обработки?

И есть ли способ, которым я могу заставить GUI изменить состояние флажка прямо в начале и затем ввести тяжелый цикл?

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

У вас есть несколько решений:

  1. Выполните вычисление в рабочем потоке, который отправит результат в основной поток.Но не меняйте элементы графического интерфейса в рабочем потоке.Как и большинство наборов инструментов, GTK не является потокобезопасным.Мне это не очень нравится, поскольку мне не нравятся потоки, поскольку они, как правило, усложняют отладку ...
  2. Разделить обработку на дескриптор бездействия.Когда я говорю «разделить», я действительно имею в виду разделить его на несколько этапов, которые занимают гораздо меньше времени для вычисления.Вы должны использовать автомат с несколькими состояниями, каждый из которых занимает намного меньше времени.Помещение большого жирного исчисления в обработчик простоя похоже на вызов sleep (5) в этом обработчике: насос сообщений GUI будет заблокирован на 5 секунд, без возможности обработки событий перерисовки ... Вот пример отложенной загрузки данных, использующих эту технику.
  3. Регулярно форсируйте вызов в рассылку сообщений, используя gtk_main_iteration .

Примеры, которые я вам дал, находятся вС, но дух тот же в питоне.

0 голосов
/ 27 июня 2011

В обработчике зарегистрируйте оставшуюся часть инициализации как обработчик простоя и вернитесь.gtk.idle_add IIRC.Таким образом, он будет работать после обработки событий графического интерфейса.Проверьте документацию, чтобы узнать, какое значение вам нужно вернуть, чтобы функция больше не запускалась.

...