El hilo funciona solo en eventos gui - pygtk

El hilo funciona solo en eventos gui - pygtk

Estoy desarrollando una aplicación multiproceso en pygtk usando rápidamente y estancado con hilos. Así que estoy experimentando con varias posibilidades y descubrí que mi hilo solo funciona cuando hago algo en la interfaz gráfica de usuario. Aquí está mi 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)

Estoy intentando actualizar el valor en un liststorehilo, pero solo se actualiza cuando hago clic en algún botón u otros eventos de interfaz gráfica de usuario, ¿por qué es así? ¿Por qué el hilo no se ejecuta en segundo plano?

Respuesta1

Threads y GTK no siempre funcionan bien juntos. Hay algunos trucos que ayudan, pero no se sorprenda si tiene errores extraños. Recientemente eliminé todos los hilos de una aplicación y se siente mucho mejor.

Entonces, lo primero que debes pensar es si puedes reescribir tu aplicación para aprovechar los métodos asíncronos de GLib.

Si insistes en tener hilos, ten en cuenta estas dos reglas:

  1. Llame a GLib.treads_init() lo antes posible en su código
  2. Cuando llame a eventos GUI en un hilo, envuélvalos en GLib.idle_add()

Estas son reglas, no pautas. Usted debesiempreHaga esto cuando trabaje con hilos.

Respuesta2

Usar time.sleep() no es una buena idea cuando usas gtk. Podrías intentar usar un evento de temporizador. (Ya no lo uso rápidamente, pero creo que esto debería 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

información relacionada