2017-01-19 1 views
1

나는 PyQt5를 사용하여 화면 주위를 움직여보기 위해 노력하고있다. 요점이 항상 움직이기를 바랍니다. 속도를 바꿀 코드를 어디에 두어야할지 모르겠습니다. 코드가 끊임없이 실행되는 메소드가 있습니까?PyQt5에서 화면에서 점을 이동하는 방법은 무엇입니까?

import sys 
from PyQt5.QtWidgets import (QApplication, QLabel, QWidget) 
from PyQt5.QtGui import QPainter, QColor, QPen 
from PyQt5.QtCore import Qt 

class MouseTracker(QWidget): 
    distance_from_target = 0 
    mouse_x_pos = 0 
    mouse_y_pos = 0 
    target_x_pos = 500 
    target_y_pos = 250 

    def __init__(self): 
     super().__init__() 
     self.initUI() 
     self.setMouseTracking(True) 

    def initUI(self): 
     self.setGeometry(200, 200, 1000, 500) 
     self.setWindowTitle('Mouse Tracker') 
     self.label = QLabel(self) 
     self.label.resize(500, 40) 
     self.show() 

    def mouseMoveEvent(self, event): 
     distance_from_target = round(((event.y() - self.target_y_pos)**2 + (event.x() - self.target_x_pos)**2)**0.5) 
     self.label.setText('Coordinates: (%d : %d)' % (event.x(), event.y()) + " Distance from target: " + str(distance_from_target))  
     self.mouse_x_pos = event.x() 
     self.mouse_y_pos = event.y() 
     self.update() 

    def mousePressEvent(self, event): 
     self.target_x_pos = event.x() 
     self.target_y_pos = event.y() 
     self.update() 

    def paintEvent(self, event): 
     q = QPainter() 
     q.begin(self) 
     q.drawLine(self.mouse_x_pos, self.mouse_y_pos, self.target_x_pos, self.target_y_pos) 

app = QApplication(sys.argv) 
ex = MouseTracker() 
sys.exit(app.exec_()) 

내가하고 싶은 것은 관계없이 마우스를 움직이거나 클릭 여부, 지속적으로 증가 target_x_pos을 할 수 있습니다 :

여기 내 코드입니다. 어떻게해야합니까?

아무 것도 응답하지 않기 때문에 루프를 구현할 수 없습니다. 스레딩이 들어오는 곳입니까?

답변

1

QTimer을 구현하기 만하면 트리거 할 때마다 self.update()을 사용하여 도면을 업데이트하는 대신 원하는 위치를 업데이트해야합니다.

import sys 

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


class MouseTracker(QWidget): 
    distance_from_target = 0 
    mouse_x_pos = 0 
    mouse_y_pos = 0 
    target_x_pos = 500 
    target_y_pos = 250 
    vel = 60 # pixels per second 

    def __init__(self, parent=None): 
     super(MouseTracker, self).__init__(parent=parent) 
     self.initUI() 
     self.setMouseTracking(True) 
     self.timer = QTimer(self) 
     self.timer.timeout.connect(self.changePosition) 
     self.timer.start(1000/self.vel) 

    def changePosition(self): 
     self.target_x_pos += 1 
     self.update() 

    def initUI(self): 
     self.setGeometry(200, 200, 1000, 500) 
     self.setWindowTitle('Mouse Tracker') 
     self.label = QLabel(self) 
     self.label.resize(500, 40) 
     self.show() 

    def mouseMoveEvent(self, event): 
     distance_from_target = round(
      ((event.y() - self.target_y_pos) ** 2 + (event.x() - self.target_x_pos) ** 2) ** 0.5) 
     self.label.setText(
      'Coordinates: (%d : %d)' % (event.x(), event.y()) + " Distance from target: " + str(distance_from_target)) 
     self.mouse_x_pos = event.x() 
     self.mouse_y_pos = event.y() 
     self.update() 

    def mousePressEvent(self, event): 
     self.target_x_pos = event.x() 
     self.target_y_pos = event.y() 
     self.update() 

    def paintEvent(self, event): 
     q = QPainter() 
     q.begin(self) 
     q.drawLine(self.mouse_x_pos, self.mouse_y_pos, self.target_x_pos, self.target_y_pos) 


app = QApplication(sys.argv) 
w = MouseTracker() 
sys.exit(app.exec_()) 

스레드로 테스트하려는 경우 다음 코드를 보여줍니다. 값을 새로 고치는 데 문제가 없었습니다.

import sys 
import time 
from PyQt5.QtCore import QThread 
from PyQt5.QtCore import QTimer 
from PyQt5.QtCore import pyqtSignal 
from PyQt5.QtWidgets import (QApplication, QLabel, QWidget) 
from PyQt5.QtGui import QPainter 


class MyThread(QThread): 
    signal = pyqtSignal(int) 

    def __init__(self, parent=None): 
     super(MyThread, self).__init__(parent=parent) 
     self.value = None 
     self.vel = None 

    def setValue(self, value): 
     self.value = value 

    def setVelocity(self, vel): 
     self.vel = vel 

    def run(self): 
     while True: 
      self.value += 1 
      self.signal.emit(self.value) 
      time.sleep(1/self.vel) 


class MouseTracker(QWidget): 
    distance_from_target = 0 
    mouse_x_pos = 0 
    mouse_y_pos = 0 
    target_x_pos = 500 
    target_y_pos = 250 
    vel = 60 # pixels per second 

    def __init__(self, parent=None): 
     super(MouseTracker, self).__init__(parent=parent) 
     self.initUI() 
     self.setMouseTracking(True) 
     self.thread = MyThread(self) 
     self.thread.setValue(self.target_x_pos) 
     self.thread.setVelocity(self.vel) 
     self.thread.signal.connect(self.updatePosition) 
     self.thread.start() 

    def updatePosition(self, val): 
     self.target_x_pos = val 
     self.update() 

    def initUI(self): 
     self.setGeometry(200, 200, 1000, 500) 
     self.setWindowTitle('Mouse Tracker') 
     self.label = QLabel(self) 
     self.label.resize(500, 40) 
     self.show() 

    def mouseMoveEvent(self, event): 
     distance_from_target = round(
      ((event.y() - self.target_y_pos) ** 2 + (event.x() - self.target_x_pos) ** 2) ** 0.5) 
     self.label.setText(
      'Coordinates: (%d : %d)' % (event.x(), event.y()) + " Distance from target: " + str(distance_from_target)) 
     self.mouse_x_pos = event.x() 
     self.mouse_y_pos = event.y() 
     self.update() 

    def mousePressEvent(self, event): 
     self.target_x_pos = event.x() 
     self.thread.setValue(self.target_x_pos) 
     self.target_y_pos = event.y() 
     self.update() 

    def paintEvent(self, event): 
     q = QPainter() 
     q.begin(self) 
     q.drawLine(self.mouse_x_pos, self.mouse_y_pos, self.target_x_pos, self.target_y_pos) 


app = QApplication(sys.argv) 
w = MouseTracker() 
sys.exit(app.exec_()) 
+0

이 방법은 작동하지만 마우스를 움직일 때마다 포인트의 움직임에 눈에 띄는 지연이 있습니다. 다소 일정한 속도로 움직이게하려면 어떻게해야합니까? mouseMoveEvent가 너무 자주 실행되고 너무 많은 리소스를 사용한다고 생각하십니까? – Kos

+0

@Kos 제 경우에는 그 문제가 없습니다. – eyllanesc

+0

이상한. Mac에서 실행 중입니까? – Kos

관련 문제