2009-12-11 63 views
1

我的意图是使用pyGTK的主循环创建一个函数,在等待用户输入时阻塞。我遇到的问题在代码最好的解释:PyGTK主循环的阻塞行为

#! /usr/bin/python 

import gtk 

def test(): 
    retval = True 
    def cb(widget): 
     retval = False 
     gtk.main_quit() 

    window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
    button = gtk.Button("Test") 
    button.connect("clicked", cb) 
    button.show() 
    window.add(button) 
    window.show() 

    gtk.main() 
    return retval 

if __name__ == "__main__": 
    print test() # prints True when the button is clicked 

看来,指令的确切顺序(retval变化值,然后退出主循环)不被这里跟随。

有没有办法解决这个问题,或者这只是我的错误设计?

回答

2

发生什么事情是,当Python看到foo = bar作为第一个参考foo在函数中它假定它是一个局部变量。在python3k中,您可以使用nonlocal关键字来解决此问题。对于2.x,你可以将你的retval包装在一个列表中,这样你就不会直接分配给它。

retval = [True] 
def cb(widget): 
    retval[0] = False 
    gtk.main_quit() 
... 
return retval[0] 

不是一个真正的完美的解决方案,因此在3.X(PEP

+0

嗯..如果我使用2.6? – int3 2009-12-11 20:44:08

+0

确实修复它,谢谢!您链接到的PEP还提供了另一种解决方案(使用'命名空间'类)。我必须决定哪一个不那么难看:P – int3 2009-12-11 20:58:30

2

这是对话框图案添加非局部。使用gtk.Dialog。 Dialog.run()完全阻止您如何使用它,并返回对话框的返回码。