Python进程不会在GTK循环退出时退出

时间:2014-05-29 07:36:02

标签: python linux gtk pygobject

问题

我松散地跟随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进程?

2 个答案:

答案 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)

希望这有帮助。