2017-01-19 2 views
1

Ich versuche mit PyQt5 einen Punkt um den Bildschirm zu bewegen. Ich möchte, dass sich der Punkt immer bewegt. Ich bin mir nicht sicher, wo ich den Code platzieren soll, um seine Geschwindigkeit zu ändern. Gibt es eine Methode, deren Code ständig ausgeführt wird?Wie verschiebe ich einen Punkt über den Bildschirm in PyQt5?

Hier ist mein Code:

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_()) 

Was ich tun möchte, ist target_x_pos machen ständig erhöht, und zwar unabhängig davon, ob die Maus oder angeklickt bewegt. Wie mache ich das?

Ich kann keine Schleife implementieren, weil dann nichts anderes reagieren würde. Kommt das Threading ins Spiel?

Antwort

1

Sie müssen nur eine QTimer implementieren, jedes Mal, wenn es ausgelöst wird, müssen Sie die gewünschte Position aktualisieren, zusätzlich zur Verwendung self.update(), um die Zeichnung zu aktualisieren.

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_()) 

Wenn Sie mit Thread testen möchten, zeige ich Ihnen den folgenden Code, ich hatte keine Probleme beim Aktualisieren der Werte.

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

Dies funktioniert, aber es gibt eine merkliche Verzögerung in der Bewegung des Punktes, wenn ich die Maus bewege. Wie kann ich es mit einer mehr oder weniger konstanten Geschwindigkeit bewegen? Denkst du, dass mouseMoveEvent zu oft ausgeführt wird und zu viele Ressourcen beansprucht? – Kos

+0

@Kos In meinem Fall habe ich dieses Problem nicht. – eyllanesc

+0

Seltsam. Laufen Sie auf einem Mac? – Kos

Verwandte Themen