Python Qt-使用lambda连接带参数的插槽

Python Qt-使用lambda连接带参数的插槽,python,qt,lambda,pyqt,signals-slots,Python,Qt,Lambda,Pyqt,Signals Slots,我有两个小部件,它们将连接到需要额外参数的单个函数 我发现我可以在适当的地方使用lambda函数向函数传递一些参数 问题是参数在循环中被替换,lambda函数只传递最后一个集合 我得到的是: self.widgets是一个包含按钮组键的词汇表,为了使其简短,我们假设它有两个按钮[QToolButton],链接到它们的键:“play”和“stop” def connections(self): for group in self.widgets: self.widgets[

我有两个小部件,它们将连接到需要额外参数的单个函数

我发现我可以在适当的地方使用lambda函数向函数传递一些参数

问题是参数在循环中被替换,lambda函数只传递最后一个集合

我得到的是:

self.widgets是一个包含按钮组键的词汇表,为了使其简短,我们假设它有两个按钮[QToolButton],链接到它们的键:“play”和“stop”

def connections(self):
    for group in self.widgets:
        self.widgets[group].clicked.connect(lambda: self.openMenu(group))

    def openMenu(self,group):
        print group
但无论我单击哪个按钮,它都会打印相同的组,即在for循环中迭代的最后一个组


有没有办法解决这个问题?

问题在于python的作用域规则和闭包。您需要
捕获
组:

def connections(self):
    for group in self.widgets:
        self.widgets[group].clicked.connect(lambda g=group: self.openMenu(g))

    def openMenu(self,group):
        print(group)

我不知道python中存在这种情况。惊人的。可能是重复的