Skip to content Skip to sidebar Skip to footer

How To Move A Point Across The Screen In Pyqt5?

I'm trying to make a point move around the screen using PyQt5. I want the point to always be moving. I'm not sure where to place the code to change it's velocity. Is there some met

Solution 1:

You only have to implement a QTimer, every time it is triggered you must update the desired position, in addition to using self.update() to update the drawing.

import sys

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


classMouseTracker(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 seconddef__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)

    defchangePosition(self):
        self.target_x_pos += 1
        self.update()

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

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

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

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

If you want to test with Thread I show you the following code, I have not had problems in refreshing the values.

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


classMyThread(QThread):
    signal = pyqtSignal(int)

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

    defsetVelocity(self, vel):
        self.vel = vel

    defrun(self):
        whileTrue:
            self.value += 1
            self.signal.emit(self.value)
            time.sleep(1/self.vel)


classMouseTracker(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 seconddef__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()

    defupdatePosition(self, val):
        self.target_x_pos = val
        self.update()

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

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

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

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

Post a Comment for "How To Move A Point Across The Screen In Pyqt5?"