2017-12-26 39 views
-1

次のコードは、1つの無作為な行を1秒ごとに描画します。私がしたいのは、それぞれの線を既に描画しておくことです。それをする最善の方法は何ですか?PyQT5 - 一時停止を使用して行を1つずつ追加する

私は

たぶん一つの方法は、隠されたすべての線を描画するだろう...私は応答性の高いユーザーインターフェースを行うために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コールを使用することになります。 1つのポイント/ラインを描画し、別のメソッドを呼び出すタイマーを設定し、別のメソッドを呼び出すためのタイマーを設定するなどの方法があります。など

などGUIで睡眠を使用することは推奨されていない、とQtはQTimer、QEventLoopと同じ効果を作成するための選択肢を提供していますので、PyQtはの場合には、それは、非常に危険です
+0

私は私の質問を更新しました:最小の実例はありません... – projetmbc

関連する問題