2013-02-20 101 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