2013-02-20 51 views
0

當我的DeleteButton函數被調用時,出現錯誤「元組索引超出範圍」。我試圖一次從列表中刪除多個對象。有人能告訴我我的邏輯有什麼問題嗎?Python簡單的循環邏輯(索引超出範圍)

def DeleteButton(self,event): 
    sel = self.task_list.GetSelections()  

    length = len(sel)  

    for item in range (0, length): 
     index = sel[item] 
     self.task_list.Delete(index) 
     sel = self.task_list.GetSelections() 
     length = len(sel) 
+1

您正在修改'loop'中的'sel'。這可能會給你一個問題。 – 2013-02-20 18:57:07

+0

doh!我意識到我不應該刪除任何索引,但我應該總是刪除循環中的第一項,直到沒有更多的刪除。解決了我自己的問題,但謝謝大家看着它! – 2013-02-20 19:01:16

回答

1

從未有過與wxPython的任何經驗,我在這有些天真的到來,但是從我可以從文檔識別,不會下面使更多的意義嗎?

def DeleteButton(self, event): 
    for id in self.task_list.GetSelections(): 
     self.task_list.Delete(id) 

好像GetSelections返回一個列表,如果選擇項的ID,那麼,爲什麼在你的例子額外的複雜性?

+0

這比使用索引訪問的while循環更「pythonic」。我認爲這個答案是最具可讀性的版本,儘管如果你真的想要的話,你可以使用1行版本:)'map(self.task_list.Delete,self.task_list.GetSelections())' – 2013-02-20 22:50:31

+0

這些絕對是簡單的放置它的方法。不過,我對這兩個例子都有問題。當我點擊「刪除任務」時,它只會刪除選擇中的第一個項目。 – 2013-02-21 12:58:32

+0

您確定GetSelections()返回多個ID嗎?如果您在調用Delete之前修改Demian Brecht的示例以打印ID,它會輸出什麼內容? – 2013-02-21 15:27:02

1

你應該使用while循環用手動的增加計數器,而不是試圖重置for每次循環的區間頂部,主要是因爲不能工作。

range(0, length) 

創建list,然後由for循環遍歷,並且可以但正如不可變循環的持續時間,所以嘗試重置length不會做你認爲它會。爲了更清楚地說明問題,這裏的一些等效代碼:

i = 5 
l = range(0, i) # l now set to list [0, 1, 2, 3, 4] 
for v in l: 
    i = v # this has no effect, as l is already instantiated and separate from i 

編輯:

對您的評論作出迴應,這裏有一個while循環,應該可以解決for循環問題(儘管可能存在未等問題在你的代碼中)。

sel = self.task_list.GetSelections() 
i = 0 
while i < len(sel): 
    index = sel[i] 
    self.task_list.Delete(index) 
    sel = self.task_list.GetSelections() 
    i += 1 
+0

你會介意給我一個很好的while循環的例子嗎?這些東西讓我感動 – 2013-02-20 19:11:26