2017-12-26 13 views
-1

다음 코드는 매초마다 임의의 임의의 줄을 그립니다. 내가하고 싶은 것은 각 선을 이미 그려 두는 것입니다. 그렇게하는 가장 좋은 방법은 무엇입니까?PyQT5 - 일시 중지를 사용하여 하나씩 줄 추가

내가 대답하는 사용자 인터페이스를 할 수있는 QTimer를 사용할 필요가 있음을 알고 있지만 처음에는 점점 더 많은 선을 그리는 방법을 알 필요가 ...

어쩌면 하나 개의 방법이 숨겨진 모든 라인을 그릴 것 및 점점 더 많은 라인을 보여주기 위해서 ... 아니면 QGraphicsView을 사용해야합니까? PyQt는 응용 프로그램에서 time.sleep을 사용

from random import random 
import sys 
from time import sleep 

from PyQt5.QtWidgets import QWidget, QApplication 
from PyQt5.QtGui import QPainter 
from PyQt5.QtCore import QTimer 


LINES = [ 
    (500*random(), 500*random(), 500*random(), 500*random()) 
    for _ in range(50) 
] 

class Interface(QWidget): 
    def __init__(self): 
     super().__init__() 

     self.max = len(LINES) 
     self.cursor = 0 

     self.painter = QPainter() 

     self.setFixedSize(500, 500) 
     self.show() 

    def paintEvent(self, e): 
     self.painter.begin(self) 
     self.drawsetpbystep() 
     self.painter.end() 

    def drawsetpbystep(self): 
     if self.cursor < self.max: 
      self.painter.drawLine(*LINES[self.cursor]) 
      self.update() 
      sleep(0.25) 

     self.cursor += 1 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    interface = Interface() 
    sys.exit(app.exec_()) 
+2

그것? 당신은 이미 SO가 코딩 서비스가 아니라는 것을 알기에 충분한 평판을 얻었습니다. – eyllanesc

+0

@eyllanesc 질문이 방금 업데이트되었습니다. – projetmbc

답변

1

,

또 다른 오류 QPainter의 수명주기가 매우 길기 때문에 paintEvent에서만 생성 및 호출되어야합니다.

그리고 마지막 실수는 drawsetpbystep 메서드를 통해 paintEvent 작업을 수행하기 때문에 paintEvent 작업을 일시 중지하려고하는 것입니다. paintEvent 메서드는 사용할 때뿐만 아니라 필요할 때마다 실제로 응용 프로그램을 사용할 것입니다. 아래 그림과 같이 페인트 할시기를 나타내는 플래그를 사용하여 플래그를 지정하면됩니다.

LINES = [ 
    (500*random(), 500*random(), 500*random(), 500*random()) 
    for _ in range(50) 
] 

class Interface(QWidget): 
    def __init__(self): 
     super().__init__() 
     self.max = len(LINES) 
     self.cursor = 0 
     self.show() 

     self.paint = False 

     timer = QTimer(self) 
     timer.timeout.connect(self.onTimeout) 
     timer.start(250) 

    def paintEvent(self, e): 
     painter = QPainter(self) 
     if self.paint: 
      self.drawsetpbystep(painter) 

    def onTimeout(self): 
     self.paint = True 
     self.update() 

    def drawsetpbystep(self, painter): 
     if self.cursor < self.max: 
      painter.drawLine(*LINES[self.cursor]) 
      self.cursor += 1 
     self.paint = False 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    interface = Interface() 
    sys.exit(app.exec_()) 
+0

훌륭하고 분명하다! 그것은 하나의 큰 문제로 남아 있습니다 : 각각의 새로운 선을 플로팅하십시오. – projetmbc

+0

나는 위의 답을 편집하여 각 선을 그려야합니다. – projetmbc

+0

라인을 유지 보수 하시겠습니까? – eyllanesc

1

하지 않는 것이 좋습니다 때문에 실제로 응용 프로그램 창을 그리기 (키보드와 마우스를 통해) 사용자의 입력을 처리하기위한 담당하는 Qt는 이벤트 루프의 차단 실행이.

대신에 QTimer을 사용하여 원하는 시간에 지정된 메서드의 실행을 예약해야합니다. 이 경우 복수 QTimer.singleShot 호출을 사용하고 싶을 것입니다. 첫 번째 메소드는 타이머에 의해 호출되어 하나의 포인트/라인을 그리고 나서 한 포인트/라인을 그리고 다른 메소드를 호출하는 타이머를 설정하는 다른 메소드를 호출하도록 타이머를 설정합니다. 등

등 GUI에서 잠을 사용하는 것이 좋습니다되지 않으며, Qt는이 QTimer, QEventLoop와 같은 효과를 만드는 대안을 제공하기 때문에 PyQt는의 경우는, 매우 위험
+0

나는 내 질문을 업데이트했다 : 최소한의 실무 예제가있다 ... – projetmbc

관련 문제