2016-03-26 3 views
0

コマンド配列には、名前とイベントを処理する関数を含むタプルのリストが含まれています。各ペアに対して、新しいボタンが作成され、QListWidgetに追加されます。 問題は、すべてのボタンが同じハンドラ関数を呼び出すことです。リストの最後のもの。私は私のデバッガでチェックし、リストを正しくループし、正しいループ関数が各ループに渡されます。pyqt4のボタンは同じイベントハンドラを持たなくても終了します

ボタンを生成する関数です。

def load_commands(self): 
    for name, handler in commands: 
     btn = QtGui.QPushButton(name) 
     btn.clicked.connect(lambda: handler(self)) 
     item = QtGui.QListWidgetItem() 
     item.setSizeHint(Qt.QSize(0, 30)) 
     self.list_commads.addItem(item) 
     self.list_commads.setItemWidget(item, btn) 

[EDIT]だけ試み各ループの最後でNoneにBTN項目を設定します。うまく行かなかった。

答えて

1

各ハンドラへの参照を保持する必要があります。そうでなければ、最後のものだけが有効範囲に残ります。それを行う1つの方法は、デフォルトの引数である:

btn.clicked.connect(lambda *args, handler=handler: handler(self)) 

clickedことは、常に、ボタンのチェックイン状態を送信し、そう*argsは、デフォルトの引数をつかう避けるためにそこにあります。

+0

ありがとうございました。それがそれを解決しました。 –