2009-12-11 104 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()完全阻止您如何使用它,並返回對話框的返回碼。