我松散地跟随this Python GTK tutorial,但是在退出gtk主循环之后Python进程本身并没有退出,并且也没有响应终端中断 - 它必须被杀死(SIGTERM)。这是我的完整代码:
from gi.repository import Gtk
from sys import exit
# debugger
# import pdb; pdb.set_trace()
class Handler:
def on_MainWindow_destroy(self):
Gtk.main_quit(*args)
exit()
if __name__ == '__main__':
builder = Gtk.Builder()
builder.add_from_file('gtkgui.glade')
builder.connect_signals(Handler())
window = builder.get_object("window1")
window.show_all()
Gtk.main()
我使用glade界面运行脚本,它看起来没问题,可视化交互,并在退出时关闭,但python进程保持运行并且不放弃终端。 (我现在正在运行Ubuntu 12.10。)
[21時25分47秒]▶ python --version
Python 2.7.3
[21時25分47秒]▶ python clientest.py
(window appears, close window)
^C^C^C^C^C^C
(no response)
我根据this question的建议分别添加了quit()
和exit()
,但行为没有变化。
我也尝试按照this question的说明进行调试,但调试器似乎也随着脚本一起挂起。
这是预期的行为吗?如何确保在GTK循环结束时退出Python进程?
答案 0 :(得分:4)
在PyGObject中,Gtk.main_quit接受可变数量的参数(被忽略)。这意味着您可以直接将其用作连接到窗口“destroy”信号的回调。
window.connect('destroy', Gtk.main_quit)
你也应该能够通过在Glade中设置一个类似于你所做的“destroy”信号处理程序来从glade文件中连接它:
class Handler:
def on_mainWindow_destroy(self, *args):
Gtk.main_quit()
builder.connect_signals(Handler())
请注意,不需要调用sys.exit()。 sys.exit()引发一个“SystemExit”异常,该异常不会通过GTK +信号回调。
答案 1 :(得分:1)
我成功地关闭了这样:
# close and exit
def delete_event(self, widget, event, donnees=None):
gtk.main_quit()
return False
并在GTK窗口中:
# setup the window
self.nightsWin = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.nightsWin.set_title("Your Title")
self.nightsWin.maximize()
self.nightsWin.connect("delete_event", self.delete_event)
希望这有帮助。