5

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

4

1 回答 1

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”是可显示图像的完整路径名。

-- 一旦图像弹出,确保窗口焦点由刚才调用“python ...”命令的 xterm 窗口保持。

-- 按 Ctrl-C。

在这一点上,什么都没有发生。Ctrl-C 似乎被忽略了。但现在 ...

-- 无需敲击键盘上的任何键,将窗口焦点设置为显示的图像窗口。

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

我的问题是:有什么方法可以重组“imageview.py”程序,使其立即响应 SIGINT (Ctrl-C),而不必先将窗口焦点设置为显示的图像?

提前感谢你们可以给我的任何帮助。


您所看到的是由信号处理程序的处理方式引起的。您被困在 Tcl/Tk 主循环中,信号处理程序仅由 Python 解释器处理。一个快速的解决方法是使用 after() 来安排一个虚拟函数大约每秒调用一次——这将使您的信号看起来得到及时处理。

——圭多·范罗森

于 2012-04-08T22:20:50.120 回答