interruption du clavier avec python gtk?

donc comme le dit la question, j'essaie de laisser les interruptions de clavier se produire pendant que Gtk.main() est en cours, cependant, il ne semble pas remarquer que l'interruption du clavier se produit avant que la fonction ne soit terminée.

alors j'ai essayé de coller Gtk.main () dans un thread séparé, et avoir le thread principal trouver le clavier interupts, et terminer le thread, mais ensuite découvrir que Gtk ne joue pas bien avec les threads comme décrit dans ce l'article

Je ne vois pas d'autre moyen de laisser le clavier interrompre le travail. Est-ce possible?

j'utilise python3, et je veux que mon programme soit éventuellement une plateforme croisée.

19
demandé sur QxQ 2013-05-07 07:43:49

3 réponses

à cause de https://bugzilla.gnome.org/show_bug.cgi?id=622084 les applications gtk écrites en utilisant pygobject ne se fermeront pas elles-mêmes en utilisant Ctrl + C sur le terminal.

pour contourner cela, vous pouvez installer un Unix gestionnaire de signal comme ceci:

if __name__ == '__main__':
    import signal
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    your_application_main()
38
répondu ebassi 2015-12-28 09:09:53

la réponse acceptée ne fonctionnerait pas pour moi. Je l'ai résolu en remplaçant les Gtk.main() appel GLib.MainLoop().run(), comme expliqué dans le rapport de bogue.

7
répondu sleblanc 2015-11-20 19:35:39

j'ai aussi eu des problèmes lors de l'utilisation du module signal pour outrepasser le gestionnaire SIGINT (100% CPU sur le thread python); une alternative pour moi était la suivante:

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()
3
répondu Florent Thiery 2015-12-27 20:22:29