[英]PyQt connect() call affecting multiple widgets
為程序制作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__()
...
但它產生了相同的不良結果。
我做了一些搜索,但所有我發現從人試圖讓我試着不要讓那種結果的問題。 任何幫助,將不勝感激。
您的問題是您沒有捕獲 lambda函數中的值。 由於Python范圍規則的工作方式,您每次都使用相同的值(最后一個)。
將lambda行更改為此以capture
所需的變量:
answer_disp.clicked.connect(
lambda ca=current_answer, a=answer: self.ap.parse_answer(ca, a))
還有其他相關問題/答案可能會給您更多有關此的解釋(例如此處 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.