2014-12-08 43 views
0

我試圖重新創建Windows記事本。PyQt/Pyside - 創建和連接動態 - 在lambda中捕獲函數和參數

我目前搞亂與QMenuBar

我做了所有的菜單和操作字典它將在以下模式:

menus = {'File':[['New', 'Ctrl+n'], 
       ['Open', 'Ctrl+o'], 
       ['Save', 'Ctrl+s'], 
       ['Save as...', None], 
       'Separator', 
       # and so on 

然後我遍歷該字典,創造菜單和操作成功並將它們存儲在第二個字典中。

現在我試圖將每個action[new, open, save, …]連接到同名的實例方法。

我做像這樣:

for action in menus[m]: 
    action = menu.addAction(action[0]) 

    if action[1]: 
     action.setShortcut(QKeySequence(action[1])) 

    if isinstance(action, QAction): 
     fname = action[0].lower() 
     # and some other string manipulations 
     func = getattr(self,fname) 
     action.triggered.connect(lambda arg=action: func(arg)) 

連接成功,但如果我嘗試使用任何行動的它什麼都不做。

我以前曾使用lambda函數連接過動作,但這是我第一次使用getattr()和lambda在一起。

+0

[Python lambda封閉範圍]可能的重複(http://stackoverflow.com/questions/13355233/python-lambda-closure-scoping) – 2014-12-08 09:33:00

+1

不要使用'__getattribute__':使用'func = getattr(self, FNAME)'。 – ekhumoro 2014-12-08 17:38:40

+0

還沒有意識到這兩者之間的區別。 – 2014-12-08 17:53:42

回答

1

找到我的錯誤:

問題是func漸漸在每個迭代上了menus覆蓋。

通過改變固定它:

action.triggered.connect(lambda arg=action:func(arg)) 

action.triggered.connect(lambda f=func,arg=a:f(arg)) 

後者作品因爲func參考被存儲是通過在拉姆達默認參數立即採取。