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

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

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

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потоке, но оно обновляется только тогда, когда я нажимаю какую-то кнопку или какие-то другие события графического интерфейса. Почему так происходит? Почему поток не работает в фоновом режиме?

решение1

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

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

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

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

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

решение2

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

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

Связанный контент