【发布时间】:2014-10-15 17:04:23
【问题描述】:
我正在编写一个使用 GTK 作为 GUI 的 Python 应用程序。我注意到从终端用 Ctrl-C 关闭它不起作用,我发现这是因为一个错误,所以我尝试手动处理信号。问题是,如果我将默认行为设置为默认行为,则会捕获信号并正确关闭应用程序,但如果我使用自定义处理程序,它就不起作用。这是我的(简化的)代码:
from gi.repository import Gtk
import signal
class MainWindow(Gtk.Window):
def __init__(self):
...
signal.signal(signal.SIGINT, self.__signal_handler)
def __signal_handler(self, signal, frame):
print "Caught!"
...
if __name__ == "__main__":
win = MainWindow()
win.show_all()
Gtk.main()
如果我设置了默认行为,则信号被正确捕获:
from gi.repository import Gtk
import signal
class MainWindow(Gtk.Window):
def __init__(self):
...
signal.signal(signal.SIGINT, signal.SIG_DFL)
...
if __name__ == "__main__":
win = MainWindow()
win.show_all()
Gtk.main()
我错过了什么吗?
编辑:
我尝试了更多,我注意到信号实际上被捕获了,但是窗口并没有立即关闭,而是只有在再次获得焦点时才关闭。相反,如果我运行一个
kill -9 pid
从另一个终端窗口,应用程序立即关闭。
【问题讨论】:
-
您需要手动处理信号吗?见keyboard interrupt with with python gtk?
-
是的,我想设置一个处理程序来管理正确写入文件的数据,即使程序被发送 SIGINT 杀死。
标签: python gtk signals pygtk gtk3