PYQT Connect Method 버그로 사용하면 목록에서 위젯을 생성합니다.

StackOverflow https://stackoverflow.com/questions/736651

  •  09-09-2019
  •  | 
  •  

문제

GUI 프로그램이 있습니다.

이름 목록에서 버튼을 자동 생성하고 함수에 연결하여 이름을 인쇄합니다.

하지만이 프로그램을 실행하면 모든 버튼을 누르고 있습니다.

그들은 모두 마지막 버튼의 이름을 반환합니다.

왜 이런 일이 일어나는지 궁금합니다. 아무도 도울 수 있습니까?

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import logging

logging.basicConfig(level=logging.DEBUG,)

class MainWindow(QWidget):
    def init(self):
        names = ('a','b','c')
        lo = QHBoxLayout(self)
        for name in names:
            button = QPushButton(name,self)
            lo.addWidget(button)
            self.connect(button,SIGNAL("clicked()"),
                         lambda :logging.debug(name))

if __name__=="__main__":
    app = QApplication(sys.argv)
    m = MainWindow();m.init();m.show()
    app.exec_() 

같은 결과 :

python t.py
DEBUG:root:c
DEBUG:root:c
DEBUG:root:c
도움이 되었습니까?

해결책

코드에 적어도 하나의 버그가 있습니다.

바꾸다:

 lambda :logging.debug(name)

에 의해:

 lambda name=name: logging.debug(name)

보다 MAP () 및 목록 이해력의 결과가 다른 이유는 무엇입니까? 자세한 내용은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top