簡體   English   中英

如何在 PyQt5 中在屏幕上移動一個點?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM