Pergunta

Eu estou tendo alguns problemas enfiar minha aplicação pyGTK. Eu dou o segmento algum tempo para completar sua tarefa, se há um problema eu só continuar assim mesmo, mas avisar o usuário. No entanto, uma vez que eu continue, esta discussão é interrompida até Gtk.main_quit é chamado. Isso está me confundindo.

O código relevante:

class MTP_Connection(threading.Thread):
    def __init__(self, HOME_DIR, username):
        self.filename = HOME_DIR + "mtp-dump_" + username
        threading.Thread.__init__(self)

    def run(self):
        #test run
        for i in range(1, 10):
            time.sleep(1)
            print i   

..........................

start_time = time.time()
conn = MTP_Connection(self.HOME_DIR, self.username)
conn.start()
progress_bar = ProgressBar(self.tree.get_widget("progressbar"),
                           update_speed=100, pulse_mode=True)
while conn.isAlive():
    while gtk.events_pending():
        gtk.main_iteration()
    if time.time() - start_time > 5:
        self.write_info("problems closing connection.")
        break
#after this the program continues normally, but my conn thread stops
Foi útil?

Solução

Em primeiro lugar, não threading.Thread subclasse, o uso Thread(target=callable).start().

Em segundo lugar, e provavelmente a causa de seu bloco aparente é que gtk.main_iteration leva um block parâmetro, cujo padrão é True, por isso a sua chamada para gtk.main_iteration vai realmente bloquear quando não há eventos para iterar por diante. Que pode ser resolvido com:

gtk.main_iteration(block=False)

No entanto, não há nenhuma explicação real pela qual você usaria esse loop cortado até ao invés do loop principal gtk real. Se você já está executando esta dentro de um loop principal, então eu sugiro que você está fazendo a coisa errada. I pode expandir suas opções se você nos dar um pouco mais detalhadamente e / ou o exemplo completo.

Em terceiro lugar, e isso só veio mais tarde: Sempre sempre sempre sempre certifique-se de ter chamado gtk.gdk.threads_init em qualquer aplicação pygtk com threads. GTK + tem diferentes caminhos de código durante a execução de rosca, e ele precisa saber para usar estes.

Eu escrevi um pequeno artigo sobre pygtk e tópicos que lhe oferece uma pequena abstração para que você nunca precisa se preocupar com essas coisas. Esse post também inclui um exemplo de barra de progresso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top