2013-05-07 9 views
18

Quindi, proprio come la domanda dice, sto cercando di lasciare che le interruzioni di tastiera avvengano mentre Gtk.main() è in corso, tuttavia, sembra non accorgersi che l'interruzione della tastiera si verifica fino al termine della funzione.interrupt di tastiera con python gtk?

Così ho provato ad attaccare Gtk.main() in un thread separato, e ho trovato il thread principale a trovare la tastiera e terminare il thread, ma poi ho scoperto che Gtk non funziona bene con i thread come descritto in this article

Non riesco a pensare a nessun altro modo per consentire alle interruzioni di tastiera di funzionare. È possibile?

Sto usando python3 e voglio che il mio programma sia alla fine multipiattaforma.

+0

potresti chiarire che cosa vuoi raggiungere? vuoi prendere cose come 'Ctrl + C'? – ebassi

+0

esattamente. se si esegue il programma nel terminale, quindi premere ctrl + c, non accade nulla fino a dopo la chiusura della finestra – QxQ

risposta

38

a causa di https://bugzilla.gnome.org/show_bug.cgi?id=622084 Le applicazioni gtk scritte usando pygobject non si chiudono quando si utilizza Ctrl + C sul terminale.

a lavorare intorno ad esso, è possibile installare un gestore di segnale Unix come questo:

if __name__ == '__main__': 
    import signal 
    signal.signal(signal.SIGINT, signal.SIG_DFL) 
    your_application_main() 
+0

è supportato solo su sistemi unix? – QxQ

+0

no, signal.signal() è disponibile anche su Windows. – ebassi

7

La risposta accettata non avrebbe funzionato per me. Ho risolto il problema sostituendo la chiamata Gtk.main() con GLib.MainLoop().run(), come spiegato nello bug report.

3

Ho anche avuto problemi durante l'utilizzo del modulo del segnale per sovrascrivere il gestore SIGINT (CPU al 100% sul thread python); un'alternativa per me era la seguente:

def main(): 
    self.mainloop = GObject.MainLoop() 
    try: 
     self.mainloop.run() 
    except KeyboardInterrupt: 
     logger.info('Ctrl+C hit, quitting') 
     self.exit() 

def exit(): 
    self.mainloop.quit() 
Problemi correlati