影响多个小部件的 PyQt connect() 调用
PyQt connect() call affecting multiple widgets
为程序制作按钮小部件。目的是创建每个 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)
这是答案显示 class:
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__()
...
但它产生了同样的不良结果。
我进行了一些搜索,但我所发现的都是人们提出的问题,他们试图获得我而非想要获得的那种结果。任何帮助将不胜感激。
您的问题是您没有捕获 lambda 函数中的值。由于 Python 范围规则的工作方式,您每次都使用相同的值(最后一个)。
将 lambda 行更改为 capture
您想要的变量:
answer_disp.clicked.connect(
lambda ca=current_answer, a=answer: self.ap.parse_answer(ca, a))
还有其他相关 questions/answers 可能会给您更多解释(例如 here)
为程序制作按钮小部件。目的是创建每个 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)
这是答案显示 class:
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__()
...
但它产生了同样的不良结果。
我进行了一些搜索,但我所发现的都是人们提出的问题,他们试图获得我而非想要获得的那种结果。任何帮助将不胜感激。
您的问题是您没有捕获 lambda 函数中的值。由于 Python 范围规则的工作方式,您每次都使用相同的值(最后一个)。
将 lambda 行更改为 capture
您想要的变量:
answer_disp.clicked.connect(
lambda ca=current_answer, a=answer: self.ap.parse_answer(ca, a))
还有其他相关 questions/answers 可能会给您更多解释(例如 here)