segmentos separados em aplicação pygtk
-
22-08-2019 - |
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
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.