2017-09-04 4 views
1

私はPython3.6、PyQt4、SQlite3でソフトウェアをやっています。ソフトウェアは、それぞれのデータ(一意のID、名前、姓、住所など)を持つ多数の学生で構成されています。GUIには、すべての生徒のリストが表示されたリストメニューがあります。PyQt4 - Button.connect()は常に最後の反復インデックスを受け取ります

リスト自体では、私が持っている学生の数に応じて繰り返します。レイアウトが作られ、それが名前を作成し、2 QPushButtons(1 PDFと生徒データを削除するために、他のを生成する)

ここで私が持っている、たとえば私のコードで

ですリスト内の各生徒の「PDFを生成する」ボタンは、「生徒の削除」ボタンの場合もあります。 = 1 self.delete_student_data(1)、その後、IDとbutton_2: 私の問題は、私はたとえば、ボタンに.clicked.connect(機能)

for i in range(0, len(self.list_menu.delete_button_list)): 
    self.list_menu.delete_button_list[i].clicked.connect(
     lambda: self.delete_student_data(self.list_menu.id_list[i])) 

を与えるとき、私はリスト上の3人の学生を持っているので、ボタン1がIDを受け取る必要がありますです2とbutton_3をid:= 3に設定します。しかし、私が理解しているところでは、.connect()の受信は実行されません。この場合、ボタンが実際にクリックされるまでではありません。したがって、.connect()が呼び出された時点で、値iはこの例では3です。したがって、すべてのボタンはid = 3のself.delete_student_dataを呼び出します。

私はふりをするようにこの仕事をする方法がないことがわかります。

私はそれを明確に記述しました。ありがとう!

+0

ヒント:あなたの問題は、3.6をPythonでは、特定の場合は、常に言語タグ(すなわち、「パイソン」)を含む、両方のタグを追加し、 "python-3.6"は "python"のアドオンタグです。適切なタグが設定されていると、あなたの質問を読んだり返信したりします。私たちは通常、「python」タグセクションでハングアウトしているだけです。 (この質問のためにあなたのタグを編集しました。次回は注意してください) – abccd

+1

デフォルトの引数を使用してください: 'connect(lambda arg、i = i:...'(NB: 'arg'パラメータが必要です。 – ekhumoro

+0

@ekhumoro私はあなたが参照している 'arg'を理解していませんでした。ここではargが使用されていますか?delete_student_data関数の中で –

答えて

0

functools.partialモジュールを使用して問題を解決しました。私が理解しているところから、partialは関数の議論を取り、それを「フリーズ」します。たぶん、誰かがこの全体の行動をよく知っていて、それをよりよく説明することができます。 Here is the documentation

今のコードは以下の通りです:SOにタグ付けするため

for i in range(0, len(self.list_menu.delete_button_list)): 
button = self.list_menu.delete_button_list[i] 
button.clicked.connect(partial(self.delete_student_data, button)) 
関連する問題