2012-07-26 87 views
1

我正在创建一个程序,用于不断检查MySQL数据库中的更改,并根据更新GTK显示。保持检查的部分处于无限循环中。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。

在此先感谢!

回答

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_quit传递给win.connect方法,而不是返回值gtk.main_quit(),如果添加括号会发生什么情况。

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

+0

我试过了。我做了一个叫做check_DB的函数。首先,我试着像这样调用它:gobject.timeout_add(1000,check_DB),但似乎没有工作。 我不想重复建立与MySQL数据库的连接,所以我不想在函数内执行那一点。 但是,我无法将连接变量传递给check_Db。 帮助? – Antimony 2012-07-26 20:11:57

+0

为了简单起见,我将连接对象设置为全局变量。 http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-c​​reated-them – anttix 2012-07-26 20:57:05

+0

@Antimony:如果你设置'win.connection = MyQuery.__ init__'中的MySQLdb.connect(...),那么当'win.check_DB'被调用时,你可以使用它。或者像@anttix所暗示的那样,你可以把连接变成一个全局变量。 – unutbu 2012-07-26 21:04:55

1

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

closing = False 

while not closing: 
    // do the MySQL stuff 

,然后再连接一个信号处理程序窗口销毁事件套,成交为True

+0

谢谢,但我该怎么做?我已经将window destroy事件连接到gtk.main_quit事件。 – Antimony 2012-07-26 20:02:20

+0

创建你自己的处理程序,并从那里调用gtk.main_quit。不过,我认为unutbu提出的解决方案在架构上要好得多,因为在这种情况下,GTK将处理程序的主循环 – anttix 2012-07-26 20:46:54

+0

我实施unutbu的解决方案的方式对我没有任何作用。你能提出一些我可能会遗漏的东西吗? (我在他的解决方案下留下了评论) – Antimony 2012-07-26 20:49:48