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?"