2017-09-04 26 views
1

我正在用Python3.6,PyQt4和SQlite3做一個軟件。該軟件由許多學生組成,每個學生都有他們的數據(唯一的ID,姓名,地址等)。GUI有一個列表菜單,是所有學生的列表。PyQt4 - Button.connect()總是接收最後一次迭代索引

在列表本身中,我根據有多少學生進行迭代。佈局是由它創建了一個名字和2個QPushButtons(一個生成PDF和其他刪除的學生數據)

下面是一個例子

在我的代碼,我有每個學生在Python列表中的每個「生成PDF」按鈕,也是「刪除學生」按鈕。 我的問題是,當我給的按鈕.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:1 self.delete_student_data(1),然後button_2使用id = 2和button_3,id:= 3。但根據我的理解,.connect()接收的內容不會執行,直到在這種情況下實際單擊此按鈕。所以此刻.connect()被調用,在這個例子中我的值是3。因此,每個按鈕都會調用id = 3的self.delete_student_data

我發現沒有辦法讓這項工作像我假裝的那樣。

希望它清楚我描述它的方式。謝謝!

+0

一種用於SO標記提示:一定要包括語言標籤(即「蟒蛇」),如果你的問題是具體到Python 3.6,添加兩個標籤,因爲「python-3.6」是「python」的附加標籤。由於我們通常只在「python」標籤部分進行環聊,所以更多人會在正確標記時閱讀/回答您的問題。 (我已經爲這個問題編輯了標籤,下次請注意) – abccd

+1

使用默認參數:'connect(lambda arg,i = i:...'(注意:因爲點擊的信號總是需要'arg'參數發送它的checked狀態) – ekhumoro

+0

@ekhumoro我不明白你指的'arg',在我的delete_student_data函數中使用了arg嗎?感謝回覆 –

回答

0

我使用functools.partial模塊解決了這個問題。從我所瞭解的情況來看,部分取決於函數的參數並「凍結」它。也許有人知道這整個行爲更好,可以更好地解釋它。 Here is the documentation

現在的代碼如下:

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)) 
相關問題