在引发tkinter帧之前,不会处理tkinter键盘中断

时间:2012-04-03 17:23:43

标签: python tkinter keyboardinterrupt

我有一个用python + tkinter编写的GUI应用程序。在我的工作流程中,我通常从命令行启动gui,在gui中做一些事情,然后我发现自己导航到其他终端窗口做一些工作。不可避免地,我想在某个时刻关闭GUI,出于习惯,我经常只是导航到启动GUI并发送KeyboardInterrupt(Ctrl-c)的终端。但是,在我在窗口管理器中引发GUI窗口之前,不会收到此中断。有谁知道为什么会这样?如果gui是在单个函数中启动的,是否有一个简单的解决方法 - multiprocessing可能吗?

1 个答案:

答案 0 :(得分:5)

来自新闻组:

我在Redhat Linux 5.0下使用Python 1.5。我想弄清楚 使用tkinter时捕获SIGINT(或Ctrl-C)的最佳方法。至 说明我遇到的问题,请执行以下操作......

- 在启用tkinter的情况下构建Python-1.5。

- 进入Python-1.5下的Demo / tkinter / guido目录    建树。

- 输入“python imageview.py image-file”,其中“image-file”是    可显示图像的完整路径名。

- 弹出图像后,确保窗口焦点为    由xterm窗口持有“python ...”命令    刚刚被援引。

- 按Ctrl-C。

此时,没有任何反应。 Ctrl-C似乎被忽略了。 但现在......

- 如果不再按键盘上的任何键,请设置窗口    聚焦到显示的图像窗口。

只要该窗口获得焦点,Ctrl-C就会生效。

我的问题是:有没有办法重组 “imageview.py”程序,以便它将响应SIGINT(Ctrl-C) 立即,无需将窗口焦点设置为显示 图像先?

提前感谢大家给我的任何帮助。


您所看到的是信号处理程序的处理方式。 你被困在Tcl / Tk主循环中,信号处理程序只是 由Python解释器处理。一个快速的解决方法是使用 after()调度一次大约一次调用的虚函数 - 这将使显示及时处理您的信号 方式。

- Guido van Rossum