我正在创建一个程序,不断检查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.
提前致谢!
答案 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()
退出了应用,因此使用括号会过早停止该程序。