gtk窗口关闭后退出无限循环

时间:2012-07-26 19:46:52

标签: python pygtk

我正在创建一个程序,不断检查MySQL数据库中的更改,并根据GTK显示的更新。持续检查的部分处于无限循环中。

我想要的是,一旦GTK窗口关闭,我就可以摆脱无限循环。

但我不知道使用什么条件。我试过了

if !window:

if window == None:

但在任何一种情况下,它都不起作用。

我的代码结构如下:

while True:

    # my code

    while gtk.events_pending():
         gtk.main_iteration()

    # something to exit here

window.connect("destroy", gtk.main_quit())

我不知道放置“window.connect”是否会导致问题,因为窗口似乎关闭得很好。另外,如果我把它放在循环中,或者在循环之前,我会得到一个运行时错误:在mainloop之外调用。

所以要重新迭代,如何使用窗口的闭包作为条件退出无限循环?我不希望用户必须使用Ctrl + C.

提前致谢!

2 个答案:

答案 0 :(得分:1)

这是一个经典的后台线程问题。 你需要有一个这样的循环:

closing = False

while not closing:
    // do the MySQL stuff

然后将信号处理程序连接到窗口销毁事件,将事件设置为True

答案 1 :(得分:0)

pygtk应用程序的基本结构通常是这样的:

win = gtk.MyWindow()
win.connect("destroy", gtk.main_quit)  # Note no paretheses after main_quit. 
gobject.timeout_add(1000, win.check_DB)  
win.show_all()
gtk.main()

gobject.timeout_add命令将每1000毫秒调用win.check_DB方法。


win.connect("destroy", gtk.main_quit)中,重要的是不要在main_quit之后加上括号。您正在将函数对象gtk.main_quit传递给win.connect方法,而不是调用gtk.main_quit()的返回值,这是添加括号时会发生的情况。

由于gtk.main_quit()退出了应用,因此使用括号会过早停止该程序。