2013-02-20 2 views
0

내 DeleteButton 함수가 호출 될 때 "튜플 인덱스가 범위를 벗어났습니다"라는 오류가 발생합니다. 한 번에 여러 개체를 목록에서 삭제하려고합니다. 누군가 내 논리에 무엇이 잘못되었는지 말해 줄 수 있습니까?루프 로직 (인덱스가 범위를 벗어남)에 대한 간단한 파이썬

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

'루프'안에서'sel '을 수정하고 있습니다. 그게 너에게 문제가 될지도 모른다. –

+0

doh! 인덱스가 무엇이든간에 삭제하지 말아야한다는 것을 알았지 만 삭제할 항목이 없을 때까지 항상 루프의 첫 번째 항목을 삭제해야합니다. 내 자신의 문제를 해결했지만 그것을 보면서 모두에게 감사드립니다! –

답변

1

내가이 조금 순진에서오고, wxPython에 어떤 경험을 한 적도없는,하지만 난이 문서에서 식별 할 수있는에서부터 훨씬 더 의미를 다음하지 않을까요?

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

그것은 GetSelections 반환 목록처럼 보인다 경우 선택한 항목의 ID, 왜 당신의 예에서 여분의 복잡성?

+0

이것은 인덱스 액세스로 while 루프를 사용하는 것보다 훨씬 "피 니닉"하다. 나는이 대답이 가장 가독성이 높은 버전이라고 생각한다. 실제로 원한다면 1 라인 버전으로도 갈 수있다.'map (self.task_list.Delete, self.task_list.GetSelections())' –

+0

이것들은 확실히 더 간단하다. 그것을 두는 방법. 그러나, 나는이 두 가지 예 모두에 문제가있다. "작업 삭제"를 클릭하면 선택 항목의 첫 번째 항목 만 삭제됩니다. –

+0

GetSelections()가 둘 이상의 ID를 반환하고 있습니까? Delete를 호출하기 전에 Demian Brecht의 예제를 수정하여 id를 출력하면 무엇이 출력됩니까? –

1

당신은 오히려 범위 for 루프의 각 반복의 상단을 재설정하는 것보다 수동으로 증가 카운터와 while 루프를 사용한다 주로 문제가 해결되지 수 있기 때문이다.

range(0, length) 

다음 for 루프에 의해 이상 반복되는 list를 생성하고, 그래서 당신이 그것을 것 생각하지 않을 것이다 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 

편집 :

이 댓글에 대응하기 위해이 여기 가능성이 존재 다른없는 문제이지만합니다 (for 루프 문제를 해결해야 while 루프의 더 명시 적으로 문제를 설명하기 위해, 여기에 몇 가지 상응하는 코드입니다 귀하의 코드에서).

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

루프가 좋은 예를 보여 주시겠습니까? 이 일들이 나를 괴롭힌다 –

관련 문제