2013-05-21 3 views
0

나는 python과 tkinter를 사용하여 경쟁 게임을 진행하고 있습니다. 지금까지, 나는 움직임이 있고, 총격을 가할 때 멋지게 나옵니다. 나는 총알을 만들고 내가 원하는 방향으로 움직일 수있다. 그러나 화면에서 사라질 때 삭제하고 싶습니다. 그게 제가 곤란을 겪고있는 부분입니다. 아래 (왼쪽 마우스 버튼에 바인딩) 내 촬영 코드와 내 이동 코드 :Tkinter game : 인스턴스 삭제

def shoot(self,e): 
    theplayer=self.find_withtag("player") 

    bullet=self.create_image([self.coords(theplayer)],image=self.playerUp,tag="bullet") 
    self.bullets.append(bullet) 

def movebullet(self): 
    for bullet in self.bullets: 
     x1,x2,y1,y2=self.bbox(bullet) 

     if x1>1200: 
      self.move(bullet,14,0) 
     else: 
      self.delete(bullet) 

내가의 삭제 코드가 작동 것이라고 생각은하지만 나에게 말한다 오류 제공 : "X1, X2를, y1, y2 = self.bbox (글 머리표) TypeError : 'NoneType'개체를 반복 할 수 없습니다. "

나는 이것이 무엇을 의미하는지 확실하지 않으며 촬영이 실제로 작동하지 않습니다. 그러나 총알을 삭제하기 전에 효과가있었습니다. 나는 누군가의 도움에 정말 감사 할 것입니다. 감사합니다

+0

x1 <1200 대신 x1> 1200을 사용 하시겠습니까? 총알이 화면에있는 동안 움직이는 것이 좋을 것 같습니다. 현재 총알이 발사 되 자마자 모든 탄환을 삭제하는 것처럼 보입니다. – ecline6

+0

좋은 캐치. 이제 그들은 실제로 이동하지만 1200에 도달하면 이전과 같은 오류가 발생합니다 –

+0

아래의 jwygralak의 대답은 NoneType – ecline6

답변

2

self.delete() 메소드의 코드와 self가 인스턴스임을 나타내는 클래스 선언 코드를 보지 않고서 무엇이 정확히 틀린 것인지 알기는 어렵습니다.

짐작할 수 있듯이, 화면에서 벗어난 총알에 대한 인스턴스 객체를 삭제하고 있지만 목록의 글 머리 기호 []에서 제거하지 않으면 다음에 movebullet (self) , 자기를 통해 반복하고 현재 존재하지 않는 총알을 이동하려고 할 때 떨어집니다.

는 시도는 : 당신이 'NoneType' object is not iterable을 볼 때

else: 
    self.bullets.remove(bullet) 
    self.delete(bullet) 
+0

자세한 내용을 살펴보면 self는 Tkinter.Canvas 위젯의 인스턴스이며 각 글 머리 기호는 해당 캔버스의 이미지라는 것을 알 수 있습니다. 캔버스에서 이미지를 제거하는 글 머리 기호 이미지에서 delete()를 호출하고 있지만 글 머리 기호 목록에는 여전히 존재합니다. – jwygralak67

+0

그것은 작동합니다! 기고 한 모든 분들께 감사드립니다. 이 게임을 만들려면 며칠 밖에 남지 않았습니다. –

+0

'accept'또는 'upvote'가 인정 될 것입니다. – jwygralak67

1

, 그건 당신이 값 None을 가지고 뭔가를 반복하려고하는 것을 의미한다 : 당신은 하나의 값 None 반복 할 수 없다.

x1,x2,y1,y2=self.bbox(bullet) 문에서 self.bbox(bullet)의 결과를 반복하고 있으며이 함수는 분명히 경우에 따라 None을 반환합니다. 이 함수의 값을 가져 와서 다른 변수로 분할하는 것과 같이 반환 할 내용을 수행하기 전에 not None인지 확인해야합니다.

예를 들어, 당신은 당신의 코드를 변경 할 수 있습니다 :

bbox = self.bbox(bullet) 
if bbox is not None: 
    x1,y1,x2,y2 = bbox 
    ... 

아마 무슨 일이 일어나고 것은 처음 총알이 당신이 잘 삭제하고 화면이 꺼지고 있다는 것입니다,하지만 당신은 잊고있어 총알 목록에서 제거하려면. 다음 번에 총알 목록을 반복 할 때 목록에 이미 삭제 된 항목이 있습니다.

수정 사항은 간단해야합니다. 글 머리 기호를 삭제하면 목록에서 제거해야합니다.

+0

솔직히, 나는 그것에 대해 가야할 생각이 없어 :) "(x1, x2, y1, y2 == self.bbox (bullet))" "if x1 <1200"진술에, 그리고 그것은 나에게 동일한 'NoneType'오류를 주었다. –

+0

오케이, 많은 의미가 있습니다. 나는 그것을 밖으로 시도 할 것이다. –

관련 문제