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在一起。
[Python lambda封閉範圍]可能的重複(http://stackoverflow.com/questions/13355233/python-lambda-closure-scoping) – 2014-12-08 09:33:00
不要使用'__getattribute__':使用'func = getattr(self, FNAME)'。 – ekhumoro 2014-12-08 17:38:40
還沒有意識到這兩者之間的區別。 – 2014-12-08 17:53:42