2017-01-19 2 views
1

Я пытаюсь сделать движение точки вокруг экрана с помощью 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 постоянно увеличивать, независимо от того, движется ли или щелкнуть мышью. Как мне это сделать?

Я не могу реализовать цикл, потому что тогда ничего другого не было бы отзывчивым. Это то, где происходит резьба?

ответ

1

Вам нужно только выполнить команду 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_()) 
+0

Это работает, но есть заметное отставание в перемещении точки всякий раз, когда я перемещаю мышь. Как заставить его двигаться с большей или меньшей постоянной скоростью? Считаете ли вы, что mouseMoveEvent работает слишком часто и занимает слишком много ресурсов? – Kos

+0

@Kos В моем случае у меня нет этой проблемы. – eyllanesc

+0

Странно. Вы работаете на Mac? – Kos

Смежные вопросы