PyQt connect()调用影响多个小部件

时间:2015-01-14 21:15:16

标签: python python-3.x pyqt

为程序制作PushButton小部件。目的是创建每个PushButton,将其连接到一个函数,该函数比较两个字符串值ap.parse_answer(),然后将PushButton添加到QGridLayout的相应单元格中:

answers = ["this", "that", "the other", "one more"]
correct_answer = "this"

for grid_pos in [(i,j) for i in range(0,2) for j in range(0,2)]:
        answer_disp = AnswerDisplay()
        current_answer = answers.pop()
        answer_disp.setText(current_answer)
        answer_disp.clicked.connect(
            lambda: self.ap.parse_answer(current_answer, answer))
        answer_grid.addWidget(answer_disp, *grid_pos)

这是AnswerDisplay类:

class AnswerDisplay(QtGui.QPushButton):
    def __init__(self):
        super(AnswerDisplay, self).__init__()
        answer_font = QtGui.QFont()
        answer_font.setWeight(24)
        answer_font.setPixelSize(20)
        self.setFont(answer_font)

不幸的是,相同的功能连接到每个按钮会发生什么。生成的最后一个函数最终在所有按钮上,因此似乎连接正在重新应用于先前创建的按钮。但是我该如何解决这个问题呢?我的方法不能完全无效,因为setText()函数正确设置每个按钮的文本而不覆盖以前的赋值。

我尝试解决制作单个AnswerDisplay的问题,然后使用deepcopy()复制它:

for grid_pos in [(i,j) for i in range(0,2) for j in range(0,2)]:
    disp = AnswerDisplay()
    answer_disp = deepcopy(disp)
    super(AnswerDisplay, answer_disp).__init__()
    ...

但它产生了同样不希望的结果。

我已经做了一些搜索,但我发现的只是人们试图获得我正在尝试而不是获得的那种结果的问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的问题是您没有捕获 lambda函数中的值。由于Python的范围规则的工作方式,您每次都使用相同的值(最后一个)。

将lambda行更改为capture所需的变量:

answer_disp.clicked.connect(
    lambda ca=current_answer, a=answer: self.ap.parse_answer(ca, a))

还有其他相关问题/答案可能会为您提供更多解释(例如here