Python PyQt/Pyside-创建和;动态连接-捕获lambda中的函数和参数
我正在尝试重新创建windows记事本 我目前正在处理Python PyQt/Pyside-创建和;动态连接-捕获lambda中的函数和参数,python,lambda,pyqt,pyside,getattr,Python,Lambda,Pyqt,Pyside,Getattr,我正在尝试重新创建windows记事本 我目前正在处理QMenuBar 我制作了一本字典,其中包含以下模式下的所有菜单和操作: menus = {'File':[['New', 'Ctrl+n'], ['Open', 'Ctrl+o'], ['Save', 'Ctrl+s'], ['Save as...', None], 'Separator',
QMenuBar
我制作了一本字典,其中包含以下模式下的所有菜单和操作:
menus = {'File':[['New', 'Ctrl+n'],
['Open', 'Ctrl+o'],
['Save', 'Ctrl+s'],
['Save as...', None],
'Separator',
# and so on
然后我迭代了这个dict,成功地创建了菜单和操作,并将它们存储在第二个字典中
现在我正在尝试将每个操作[新建、打开、保存,…]
连接到一个同名的实例方法
我是这样做的:
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。发现了我的错误:
问题是func
在菜单上的每次迭代中都会被覆盖
通过更改来修复它:
action.triggered.connect(lambda arg=action:func(arg))
到
后者之所以有效,是因为默认情况下,lambda中的参数会立即存储对func
的引用。不使用\uuuuuu getattribute\uuuuu的可能重复:使用func=getattr(self,fname)
。不知道这两者之间的区别。
action.triggered.connect(lambda f=func,arg=a:f(arg))