많은 소스의 레코드가 포함 된 큰 파일의 데이터를 플롯하는 Python 응용 프로그램에서 작업하고 있습니다. 사용자에게 제공하려는 옵션 중 하나는 원하는 경우 이러한 소스의 하위 집합에 대해서만 플롯 할 수있는 옵션입니다. 먼저 파일을 읽은 다음 고유 한 항목 수를 확인한 다음 각 소스에 고유 한 이름을 가진 QCheckBox()를 만듭니다. 각 소스는 고유 한 이름을가집니다. 이 특별한 경우 데이터 파일은 키가 고유 한 소스 인 거대한 사전으로 파싱됩니다. 각 확인란에 대해 stateChange() 이벤트에 연결 한 다음 상자가 선택되어 있지 않으면 해당 소스에 대해 플로팅을 사용하지 않도록하려고합니다. 이 경우 확인란이 선택되거나 선택 취소되면 소스 목록에서 소스를 추가/제거합니다. 내가 겪고있는 문제는 모든 체크 박스가 결국 내 목록의 최종 소스에 연결된다는 것입니다.동적으로 생성 된 QCheckBoxes에 대한 stateChange 이벤트에 연결
처음에는 생성 된 창이 올바르게 보이며 각 단추의 이름이 적절합니다. 버튼을 누를 때마다 btnstate()는 해당 버튼과 관련된 텍스트를 간단히 인쇄합니다. 예제의 라디오 버튼과 같이 각 버튼을 명시 적으로 정의 할 수 있으면이 메서드가 작동합니다. 두 단추 중 하나를 클릭하면 인쇄 된 단추의 정확한 이름을 얻을 수 있지만 확인란을 선택 취소하거나 다시 선택하면 btnstate가 "test4"를 인쇄합니다.
내가 뭘 잘못하고 있니? 나는이 일어나고있는 이유는 파이썬이 결합 루프 내부 참조를 바인드 해제하는 방법과 관련이있다 생각
import sys
from PyQt4.QtGui import *
def btnstate(b):
print b.text()
def main():
app = QApplication([])
widget = QWidget()
layout = QVBoxLayout()
widget.setLayout(layout)
radio_layout = QHBoxLayout()
checkbox_layout = QHBoxLayout()
#setup radio buttons for config pop-up window
r1 = QRadioButton("Page Count")
r2 = QRadioButton("Date")
r1.toggled.connect(lambda:btnstate(r1))
r2.toggled.connect(lambda:btnstate(r2))
radio_layout.addWidget(r1)
radio_layout.addWidget(r2)
cbs = []
for idx, serial in enumerate(["test1", "test2", "test3", "test4"]):
temp = QCheckBox(serial)
temp.setText(serial)
temp.setChecked(True)
checkbox_layout.addWidget(temp)
temp.stateChanged.connect(lambda:btnstate(temp))
cbs.append(temp)
layout.addLayout(radio_layout)
layout.addLayout(checkbox_layout)
widget.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
텍스트가 너무 많아 설명을 단순화하십시오. – eyllanesc