[英]How to move a point across the screen in 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
不斷增加,無論鼠標是移動還是點擊。 我該怎么做呢?
我無法實現循環,因為這樣就沒有其他響應了。 這是線程的用武之地嗎?
你只需要實現一個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_())
如果您想使用 Thread 進行測試,我會向您展示以下代碼,我在刷新這些值時沒有遇到任何問題。
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_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.