私はたくさんのソースからのレコードを含む大きなファイルのデータをプロットするPythonアプリケーションを開発しています。私がユーザーに与えようとしているオプションの1つは、必要に応じてこれらのソースのサブセットのみをプロットするオプションです。最初にファイルを読み、ユニークなものが何個あるかを調べ、ソースごとに名前が付けられたQCheckBox()を作成します(それぞれのソースは一意の名前を持ちます)。この特定の場合、データファイルは、キーが固有のソースである巨大な辞書に解析されます。私は各チェックボックスのstateChange()イベントに接続し、ボックスがチェックされていないときにそのソースのプロットを無効にしたいとします。この場合、チェックボックスをオンまたはオフにしたときにソースリストにソースを追加/削除します。私が実行している問題は、すべてのチェックボックスが私のリストの最終的なソースに接続することです。ダイナミックに作成されたQCheckBoxesのstateChangeイベントに接続
最初に作成されたウィンドウは正しく表示され、各ボタンの名前は適切です。ボタンが押されるたびに、btnstate()はそのボタンに関連付けられたテキストを単に出力することになっています。この例のラジオボタンに示すように、各ボタンを明示的に定義できる場合は、このメソッドが機能します。いずれかをクリックすると、ボタンの正しい名前が表示されますが、チェックボックスのチェックを外す/再チェックすると、btnstateは "test4"を表示します。
私は間違っていますか?私はこれが起こっていることの理由は、Pythonが結合して、ループ内の参照をアンバインドする方法に関係していると思います
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