Тема работает только на графических событиях - pygtk

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

t = threading.Thread(target=self.calc,args=(treeiter))
t.daemon = True
t.start()

    def calc(self,treeiter):
        store=self.builder.get_object('liststore1')
        per=0
        while 1:
            print "Calcing and changing percent,per="+str(per)
            tore.set_value(treeiter,4,str(int(per))+"%")
            per+=1
            time.sleep(1)

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

2
задан 31 March 2013 в 17:02

2 ответа

Темы и GTK не всегда хорошо играют вместе. Есть несколько хитростей, которые помогают, но не удивляйтесь, если есть странные ошибки. Недавно я удалил все потоки из приложения, и теперь он намного лучше.

Итак, первое, о чем вы должны подумать, - можете ли вы переписать свое приложение, чтобы использовать преимущества асинхронных методов GLib.

Если вы настаиваете на наличии потоков, помните об этих двух правилах:

  1. Вызовите GLib.treads_init () как можно раньше в своем коде
  2. При вызове событий GUI поток, оберните их в GLib.idle_add ()

Это правила, а не рекомендации. Вы должны всегда делать это при работе с потоками.

0
ответ дан 31 March 2013 в 17:02

Использование time.sleep () не очень хорошая идея, когда вы используете gtk. Вы можете попробовать использовать событие таймера. (Я больше не использую быстро, но это должно работать, я думаю.)

from gi.repository import GLib

class Just_for_correct_coding():
    self.per = int()

    def start(self):
        GLib.timeout_add_seconds(1, self.calc)

    def calc(self,treeiter):
        store=self.builder.get_object('liststore1')
        print "Calcing and changing percent,per="+str(self.per)
        tore.set_value(treeiter,4,str(int(self.per))+"%")
        self.per+=1
        return True #important if you want to keep the timer running
0
ответ дан 31 March 2013 в 17:02

Другие вопросы по тегам:

Похожие вопросы: