2017-09-24 3 views
0

저는 PyQt4를 사용하여 진화 시뮬레이터 응용 프로그램을 작성하고 있습니다. QGraphics 장면에는 '생물'과 '초목'이 있습니다. 생물들은 먹을 때 수축하는 식물을 먹고 특정 크기로 내려 가면 죽어서 장면에서 삭제됩니다. 굶어 죽은 생물도 죽을 때 삭제됩니다.장면에서 QGraphicsItem을 삭제하는 중 세그먼트 오류가 발생했습니다.

문제는 내가 장면에서 초목을 삭제할 때 세분화 오류가 발생한다는 것입니다 (즉각적이지 않고 시간이 많이 걸립니다). 이것은 생물들에게는 일어나지 않았는데, 식물을 추가 할 때만, 개념적으로는 생물들 (클래스 인스턴스들)과 동일하지만. 나는 항목을 삭제

특정 루프는 다음과 같이 (코드 주석으로 대체 코드의 상당한 양의 단순화)입니다 :

dead = set() 
    items = self.scene.items() 
    for item in items: 
     if isinstance(item, Creature): 
      # Do some calculation to specify what creature does 
      for item1 in self.scene.items(): 
       # Look through other items on scene and define interactions 
       if isinstance(item1, Creature): 
        # Specify what to do if current item is being compared to another creature 
       if isinstance(item1, Vegetation): 
        # Specify what to do if current item is being compared to vegetation 
       # If creature dies, add to dead set 
       dead.add(item) 

     elif isinstance(item, Vegetation): 
      # Do same as for creature (see above) 
     # If vegetation dies, add to dead set 
     dead.add(item) 

    # Get rid of all dead items from scene 
    while dead: 
     deadItem = dead.pop() 
     self.scene.removeItem(deadItem) 
     del deadItem 

그때하여 self.scene.removeItem 라인을 주석 경우 프로그램이 중단되지 않습니다.

프로그램이 더 이상 유효하지 않은 메모리 주소를 호출하는 것으로 보이지만 그 원인을 알 수 없습니다.

전체 응용 프로그램이 상당히 길기 때문에 여기에 설명하지 않은 이유가 있지만 필요한 경우 추가 할 수 있습니다.

저는 Windows에서 PyQt4를 사용하여 Python 3.4.3을 실행하고 있습니다.

+0

항목을 반복하면서 항목을 삭제하는 것은 좋지 않은 것처럼 보입니다. 아니면 들여 쓰기가 잘못 되었습니까? – ekhumoro

+0

당신이 말하는 것을 봅니다. 나는 그것을 움직이려 고 노력 했으므로 'for item for items'루프 밖에 있지만 프로그램은 여전히 ​​충돌합니다. –

+0

게시 된 코드에서 들여 쓰기가 잘못되었다고 생각합니다. – strubbly

답변

0

이와 비슷한 문제가있는 사람이라면 해결 방법을 찾았습니다. 그것은 식물과 생물의 경계선과 관련이 있습니다. QRectF()가 변경 될 때, 장면은 여전히 ​​변경 전에 이전 boundingRect()를 사용합니다. 수정 그들이 변경하면 각 항목의 새로운 QRectF()를 업데이트하는 장면을 준비에 의해 수행되었다, 그렇게 할 수있는 코드가 있었다 :

item.prepareGeometryChange() 

또는

item1.prepareGeometryChange() 

은 유기체가 있었다에 따라 변경되었습니다. 이 코드 줄은 QRectF()가 변경되기 바로 전에 추가되었습니다.

boundingRect에 대한 언급은 @strubbly에게 감사드립니다.

관련 문제