【问题标题】:keyboard interrupt with with python gtk?用python gtk键盘中断?
【发布时间】:2013-04-30 22:09:13
【问题描述】:

所以就像问题说的那样,我试图让键盘中断在 Gtk.main() 正在进行时发生,但是,它似乎直到函数完成后才注意到键盘中断发生.

所以我尝试将 Gtk.main() 粘贴在一个单独的线程中,并让主线程找到键盘中断,并终止线程,但后来发现 Gtk 不能很好地与 @987654321 中所述的线程配合使用@

我想不出任何其他方法可以让键盘中断起作用。这可能吗?

我正在使用 python3,并希望我的程序最终是跨平台的。

【问题讨论】:

  • 您能否说明您想要实现的目标是什么?你想捕捉Ctrl + C之类的东西吗?
  • 完全正确。如果你在终端运行程序,然后按 ctrl+c,在窗口关闭之前什么都不会发生

标签: python python-3.x gtk try-catch


【解决方案1】:

因为https://bugzilla.gnome.org/show_bug.cgi?id=622084使用pygobject编写的gtk应用程序在终端上使用Ctrl + C时不会自行关闭。

要解决这个问题,您可以像这样安装一个 Unix 信号处理程序:

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

【讨论】:

  • 这似乎也适用于 libgit2 (pygit2) 调用,允许 UserInterrupt 中断低级库调用(好吧,我不知道全部细节,我只知道我得到了我的立即退壳)
【解决方案2】:

接受的答案对我不起作用。我通过将Gtk.main() 调用替换为GLib.MainLoop().run() 来解决它,如bug report 中所述。

【讨论】:

    【解决方案3】:

    在使用信号模块覆盖 SIGINT 处理程序(python 线程上 100% CPU)时,我也遇到了麻烦;对我来说,另一种选择是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多