Прерывание клавиатуры с помощью python gtk?

Итак, как и в вопросе, я пытаюсь разрешить прерывания клавиатуры, когда выполняется Gtk.main(), однако он просто не замечает, что прерывание клавиатуры происходит до тех пор, пока функция не будет выполнена.

Итак, я попытался приклеить Gtk.main() в отдельном потоке, и основной поток обнаружил, что клавиатурные перехваты и завершают поток, но потом выяснили, что Gtk не играет красиво с потоками, как описано в эта статья

Я не могу думать о другом способе работы клавиатурных прерываний. Возможно ли это?

Я использую python3 и хочу, чтобы моя программа в конечном итоге была кросс-платформой.

Ответ 1

из-за https://bugzilla.gnome.org/show_bug.cgi?id=622084 gtk-приложения, написанные с использованием pygobject, не будут закрываться при использовании Ctrl + C на терминале.

чтобы обойти его, вы можете установить обработчик сигнала Unix следующим образом:

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

Ответ 2

Принятый ответ не будет работать для меня. Я разрешил его, заменив вызов Gtk.main() на GLib.MainLoop().run(), как описано в отчете об ошибке .

Ответ 3

У меня также возникли проблемы при использовании сигнального модуля для переопределения обработчика SIGINT (100% -ный процессор в потоке python); альтернативой для меня было следующее:

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()