如何在python中记录鼠标移动



我一直在使用pygame来跟踪鼠标的移动,我想知道是否有一种方法可以以某种方式记录它们,这样我就可以播放鼠标的位置。我正在尝试开发一种机器学习程序。这就是我目前所拥有的:

import pygame
import RPi.GPIO as GPIO
import time

servoPIN = 17
servoPIN2 = 27
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
GPIO.setup(servoPIN2, GPIO.OUT)
p = GPIO.PWM(servoPIN, 50) # GPIO 17 for PWM with 50Hz
r = GPIO.PWM(servoPIN2, 50)
p.start(5.5)
r.start(5.5)

running = True
screen = pygame.display.set_mode((1200, 1200))
while running:
event = pygame.event.poll()
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEMOTION:
(x,y) = event.pos
print (x,y)
d = float(x/100)
f = float(y/100)
p.ChangeDutyCycle(d)
r.ChangeDutyCycle(f)

您可以将(x,y(位置存储在一个文件中。说mouseMovements.txt

这个文件可以由库pyautogui读取,然后可以播放鼠标。

import pyautogui
ifp = open("mouseMovements.txt", "r")
for line in ifp:
x, y = line.strip().split(",")
pyautogui.moveTo(x, y)

如果你需要更多帮助,这是详细的文档。https://pyautogui.readthedocs.io/en/latest/

为什么不列出鼠标位置。然后你可以通过它们循环回来。

当你移动鼠标时,你可以得到它的每一帧,这样它就不会一直移动,它会等待,如果你在录音中等待的话。

Mouse_recording = []
while running:
MouseX, MouseY = pygame.mouse.get_pos()
Mouse_recording.append((MouseX,MouseY))
#do other stuff

这可能太快了,给了你太多的分数,所以你可以用pygame.time.Clock()设置fps

Clock = pygame.time.Clock()
while running:
Clock.tick(60) # stops the program from running more than 60 fps

使用列表。您想要存储已用作输入ChangeDutyCycle:的位置

mouse_pos = [] 
while running:
event = pygame.event.poll()
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEMOTION:
(x,y) = event.pos
mouse_pos.append((x, y))
# [...]

例如,您可以将列表存储到csv文件:

with open("mouse_pos.csv", mode='w')  as csv_file:
csv_writer = csv.writer(csv_file)
for pos in mouse_pos: 
csv_writer.writerow(pos)

并将其读回列表:

mouse_pos = []
with open("mouse_pos.csv") as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
if len(row) >= 2:
mouse_pos.append((int(row[0]), int(row[1])))

稍后您可以"回放"列表中的位置:

for (x, y) in mouse_pos:  
d = float(x/100)
f = float(y/100)
p.ChangeDutyCycle(d)
r.ChangeDutyCycle(f) 

甚至可以通过pygame.mouse.set_pos():设置鼠标位置

pos_i = 0
clock = pygame.time.Clock()
running = True
while running:
clock.tick(10)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if pos_i < len(mouse_pos)
(x,y) = mouse_pos[pos_i]
pos_i += 1
pygame.mouse.set_pos((x, y))
d = float(x/100)
f = float(y/100)
p.ChangeDutyCycle(d)
r.ChangeDutyCycle(f) 
else:
running = False