Thread funciona apenas em eventos gui - pygtk

Thread funciona apenas em eventos gui - pygtk

Estou desenvolvendo um aplicativo multithread em pygtk usando rapidamente e preso a threads. Então estou experimentando várias possibilidades e descobri que meu thread só funciona quando faço algo na GUI Aqui está meu código

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)

Estou tentando atualizar o valor liststorepor thread, mas ele só é atualizado quando clico em algum botão ou em alguns outros eventos da GUI, por que isso acontece? por que o thread não está sendo executado em segundo plano?

Responder1

Threads e GTK nem sempre funcionam bem juntos. Existem alguns truques que ajudam, mas não se surpreenda se tiver bugs estranhos. Recentemente, removi todos os threads de um aplicativo e parece muito melhor.

Portanto, a primeira coisa que você deve pensar é se pode reescrever seu aplicativo para aproveitar as vantagens dos métodos assíncronos da GLib.

Se você insiste em ter tópicos, lembre-se destas duas regras:

  1. Chame GLib.treads_init() o mais cedo possível em seu código
  2. Ao chamar eventos GUI em um thread, envolva-os em GLib.idle_add()

Estas são regras, não diretrizes. Você devesemprefaça isso ao trabalhar com threads.

Responder2

Usar time.sleep() não é uma boa ideia quando você está usando gtk. Você poderia tentar usar um evento de timer. (Eu não uso mais rapidamente, mas acho que deve funcionar.)

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

informação relacionada