1

我正在创建一个程序,不断检查 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”是否会导致问题,因为窗口似乎关闭得很好。另外,如果我将它放在循环内或循环之前,我会得到一个运行时错误:在主循环之外调用。

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

提前致谢!

4

2 回答 2

1

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

closing = False

while not closing:
    // do the MySQL stuff

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

于 2012-07-26T19:52:05.947 回答
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命令将win.check_DB每 1000 毫秒调用一次该方法。


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

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

于 2012-07-26T19:56:25.810 回答