簡體   English   中英

PyQt connect()調用影響多個小部件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM