如何在Tkinter应用程序中捕获在IPython控制台中引发的KeyboardInterrupt?

时间:2015-10-02 10:52:22

标签: python tkinter ipython

我有一个简单的Tkinter窗口,从IPython控制台启动(所以不调用mainloop(),如果相关的话)

当我在控制台中按Ctrl + C时,没有任何反应......直到Tkinter窗口执行某些操作,此时它会捕获KeyboardInterrupt并引发错误。

问题是:如何捕获KeyboardInterrupt?似乎无论我在哪里尝试:阻止,已经太晚了......

以下是一个例子:

class App(object):
  def __init__(self,):
    self.root = tk.Tk()
    self.root.bind('<FocusIn>', self.focus_in)

  def focus_in(self, event):
    print 'I got focus'

在IPython控制台中:

app = App()

现在在控制台中按Ctrl + C.然后单击应用程序窗口......然后敲打:

Traceback (most recent call last):
File "/usr/local/lib/python2.7/lib-tk/Tkinter.py", line 1481, in __call__
def __call__(self, *args):
KeyboardInterrupt

在focus_in中添加'try / except KeyboardInterrupt'块无济于事。

所以?这是一个错误吗? TKinter甚至会看到那个中断吗?我可以在IPython空闲时禁用SIGINT吗? (当然,当它运行一些代码时我仍然想要它...)

1 个答案:

答案 0 :(得分:0)

一种方法是在另一个线程中创建一个主循环,它总是在等待KeyboardInterrupt异常,虽然我不知道这是不是很好,但我相信它会解决你的问题。 / p>