Python PyQt/Pyside-创建和;动态连接-捕获lambda中的函数和参数

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',

我正在尝试重新创建windows记事本

我目前正在处理
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))