keyboard interrupt with with python gtk?

2019-01-22 13:25发布

So just like the question says, I'm trying to let keyboard interrupts happens while Gtk.main() is in progress, however, it just doesn't seem to notice that the keyboard interrupt happens until after the function is done.

So I tried sticking Gtk.main() in a separate thread, and have the main thread find the keyboard interupts, and terminate the thread, but then found out that Gtk doesn't play nicely with threads as described in this article

I can't think of any other way to let keyboard interrupts work. Is this possible?

I'm using python3, and want my program to eventually be cross platform.

3条回答
男人必须洒脱
2楼-- · 2019-01-22 13:51

because of https://bugzilla.gnome.org/show_bug.cgi?id=622084 gtk applications written using pygobject will not close themselves when using Ctrl + C on the terminal.

to work around it, you can install a Unix signal handler like this:

if __name__ == '__main__':
    import signal
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    your_application_main()
查看更多
霸刀☆藐视天下
3楼-- · 2019-01-22 14:00

The accepted answer would not work for me. I resolved it by replacing the Gtk.main() call with GLib.MainLoop().run(), as explained in the bug report.

查看更多
一纸荒年 Trace。
4楼-- · 2019-01-22 14:00

I also ran into trouble when using the signal module to override the SIGINT handler (100% CPU on the python thread); an alternative for me was the following:

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()
查看更多
登录 后发表回答