阻止PyGTK主循环的行为

时间:2009-12-11 20:34:14

标签: python callback 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 个答案:

答案 0 :(得分:3)

这是对话框模式。使用gtk.Dialog。 Dialog.run()完全阻止你需要它,并返回对话框的返回码。

答案 1 :(得分: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

中增加了非本地