Controllo del mouse con Python


206

Come si controlla il cursore del mouse in Python, ovvero spostandolo in una certa posizione e facendo clic, sotto Windows?


1
È necessario eseguire il movimento del mouse in codice senza l'intervento dell'utente?
rahul,

Maggiori informazioni sarebbero davvero utili ...
Gabriel Hurley il

Wotk in Windows e non uso alcun toolkit. Sono veramente nuovo in Python e non ho mai lavorato con nessuna GUI prima d'ora. Da dove comincio? Quale manuale dovrei leggere?
Sasha,

2
perché hai bisogno di un pitone per farlo, puoi farlo tu stesso? su una nota più seria, perché ne hai bisogno, qual è lo scopo, un po 'più di dettagli sarebbero grandiosi
Anurag Uniyal

2
Cordiali saluti, se si utilizza questo per impedire il blocco della macchina, si potrebbe violare la politica di sicurezza della società o delle organizzazioni in quanto è un mezzo per aggirare le proprietà di blocco automatico del computer. L'ho usato in alcuni punti senza problemi, assicurati sempre di verificare con i tuoi amministratori di sistema. Ho visto persone perdere il lavoro per cose minori come questa.
AlienAnarchist

Risposte:


329

Testato su WinXP, Python 2.6 (3.x anche testato) dopo l'installazione di pywin32 (pywin32-214.win32-py2.6.exe nel mio caso):

import win32api, win32con
def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
click(10,10)

11
win32api.SetCursorPos((x,y))è meglio essere sostituito dalla win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))mia esperienza per una migliore integrazione con altre applicazioni come i giochi.
Falcon,

1
@ ObsessiveSSOℲ basta togliere il flag MOUSEEVENTF_ABSOLUTE. per dettagli: msdn.microsoft.com/en-us/library/windows/desktop/…
Falcon,

posso usare questa libreria per controllare la velocità / accelerazione del mouse?
Someoneelonese

Ciò ha avuto il vantaggio di non richiedere l'installazione (e la relativa revisione e approvazione da parte della direzione) di moduli Python non standard su oltre 50 box di finestre (chioschi di digital signage).
brichins,

4
testato anche su python3.xopere, sentiti libero di modificare la risposta
WhatsThePoint

132

Prova con il modulo PyAutoGUI . È multipiattaforma.

pip install pyautogui

E così:

import pyautogui
pyautogui.click(100, 100)

Ha anche altre caratteristiche:

import pyautogui
pyautogui.moveTo(100, 150)
pyautogui.moveRel(0, 10)  # move mouse 10 pixels down
pyautogui.dragTo(100, 150)
pyautogui.dragRel(0, 10)  # drag mouse 10 pixels down

Questo è molto più semplice che passare attraverso tutte le cose di win32con.


14
Grande! È multipiattaforma!
les

Pyautogui è un modulo eccezionale, ma purtroppo molto lento. In Ubuntu sposta il cursore 2-3 volte al secondo. Incredibile! Pyuserinput è 1000 volte più veloce.
Vladyslav Savchenko,

1
Per le persone che cercano di installare pyautogui, guardate qui stackoverflow.com/questions/5892297/... e assicurarsi di mettere sudo davanti ai tuoi comandi se avete problemi di permessi.
retodaredevil,

5
"PyAutoGUI è lento" a causa di una funzione di sicurezza che aggiunge una pausa di 0,1 secondi dopo ogni chiamata. Se lo script è fuori controllo, puoi sbattere il mouse nell'angolo in alto a sinistra in quegli 0,1 secondi per fermarlo. Per disabilitarlo, esegui pyautogui.PAUSE = 0 (anche se questo non è raccomandato, perché non puoi usare il mouse / la tastiera per fermare lo script.)
Al Sweigart

75

È possibile utilizzare win32apio il ctypesmodulo per utilizzare le API Win32 per il controllo del mouse o di qualsiasi interfaccia grafica

Ecco un esempio divertente per controllare il mouse usando win32api:

import win32api
import time
import math

for i in range(500):
    x = int(500+math.sin(math.pi*i/100)*500)
    y = int(500+math.cos(i)*100)
    win32api.SetCursorPos((x,y))
    time.sleep(.01)

Un clic usando i tipi:

import ctypes

# see http://msdn.microsoft.com/en-us/library/ms646260(VS.85).aspx for details
ctypes.windll.user32.SetCursorPos(100, 20)
ctypes.windll.user32.mouse_event(2, 0, 0, 0,0) # left down
ctypes.windll.user32.mouse_event(4, 0, 0, 0,0) # left up

11
il tuo codice ctypes ha funzionato per me senza librerie aggiuntive! (python 2.6 su Windows 7)
intrepion

1
Senza l'uso di alcuna libreria esterna! Grazie
Akshat Agarwal il

2
Grazie! Non posso sopportare che ci siano 3 librerie di terze parti con cui puoi farlo, tuttavia tutte e 3 le librerie sono esasperanti da installare o risolvere. Questa soluzione Ctypes è la prima soluzione nativa di Python e funziona meglio di ogni altra che abbia mai incontrato.
DuckPuncher

Dov'è la documentazione SetCursorPos?
ArtOfWarfare

22

Un'altra opzione è quella di utilizzare il pacchetto AutoPy multipiattaforma . Questo pacchetto ha due diverse opzioni per spostare il mouse:

Questo frammento di codice sposta immediatamente il cursore in posizione (200.200):

import autopy
autopy.mouse.move(200,200)

Se invece desideri che il cursore si sposti visibilmente sullo schermo in una determinata posizione, puoi utilizzare il comando smooth_move:

import autopy
autopy.mouse.smooth_move(200,200)

21

Dai un'occhiata alla piattaforma multipiattaforma PyMouse: https://github.com/pepijndevos/PyMouse/


8
PyMouse è stato sostituito da PyUserInput , si adatta perfettamente alla richiesta, semplice da usare e multipiattaforma. Grande +1
user336851

@ user336851, sai come tap spacee tap screen shot keyusando PyUswerInput?
user3768495

@ user336851, In questo momento PyUserInputè rotto. Non posso dire se funziona bene o no perché non riesco nemmeno a farlo installare a causa di dipendenze interrotte.
DuckPuncher

20

Linux

from Xlib import X, display
d = display.Display()
s = d.screen()
root = s.root
root.warp_pointer(300,300)
d.sync()

Fonte: spostamento del mouse Python in 5 righe di codice (solo Linux) .


20
Un google per "Python che controlla il movimento del mouse" ora trova questa pagina, come meta.
Copas,

2
Per completezza, poiché la domanda ha anche chiesto di simulare i clic del mouse, aggiungerò: Xlib.ext.xtest.fake_input(d, X.ButtonPress, 1); d.sync(); time.sleep(0.001); Xlib.ext.xtest.fake_input(d, X.ButtonRelease, 1); d.sync();la chiamata sleep () tra stampa e rilascio può o non può essere richiesta a seconda dell'applicazione di destinazione.
user336851

4
@Copas - I risultati visualizzati su Google non significano nulla. Sei in una bolla. Questo appare in una ricerca DuckDuckGo per lo stesso termine: è qualcosa di reale. È qualcosa che tutti gli altri possono riprodurre e vedere da soli. Questo è meta.
ArtOfWarfare il

1
Per controllare il mouse in una sessione VNC, è necessario il numero di visualizzazione, ad esempio "d = display.Display (': 1')" dove: 1 è il numero di visualizzazione.
Zafer

12

Pynput è la migliore soluzione che ho trovato, sia per Windows che per Mac. Super facile da programmare e funziona molto bene.

Per esempio,

from pynput.mouse import Button, Controller

mouse = Controller()

# Read pointer position
print('The current pointer position is {0}'.format(
    mouse.position))

# Set pointer position
mouse.position = (10, 20)
print('Now we have moved it to {0}'.format(
    mouse.position))

# Move pointer relative to current position
mouse.move(5, -5)

# Press and release
mouse.press(Button.left)
mouse.release(Button.left)

# Double click; this is different from pressing and releasing
# twice on Mac OSX
mouse.click(Button.left, 2)

# Scroll two steps down
mouse.scroll(0, 2)

Ho appena provato a eseguire un vecchio programma su un computer Windows e non ha funzionato, quindi prova prima di usarlo. Questo programma sostiene almeno di supportare entrambi.
Pro Q

Ho fatto alcuni test e si è scoperto che il mio problema era che su Mac, avendo float come valori di coordinate funziona bene, ma su Windows, le coordinate devono essere numeri interi. Questo modulo è multipiattaforma.
Pro Q

Ho aggiunto un problema al repository github per vedere se possono migliorarlo: github.com/moses-palmer/pynput/issues/79
Pro Q

Sembra che il problema sia stato risolto da allora.
Pro Q

8

Funzione rapida e sporca che ti farà clic in qualsiasi clicksmomento su Windows 7 usando la ctypeslibreria. Nessun download richiesto.

import ctypes

SetCursorPos = ctypes.windll.user32.SetCursorPos
mouse_event = ctypes.windll.user32.mouse_event

def left_click(x, y, clicks=1):
  SetCursorPos(x, y)
  for i in xrange(clicks):
   mouse_event(2, 0, 0, 0, 0)
   mouse_event(4, 0, 0, 0, 0)

left_click(200, 200) #left clicks at 200, 200 on your screen. Was able to send 10k clicks instantly.

7

A partire dal 2020 , puoi usare il mouse :

import mouse
mouse.move("500", "500")
mouse.left_click()

Caratteristiche

  • Hook per eventi globale su tutti i dispositivi mouse (cattura gli eventi indipendentemente dal focus).
  • Ascolta e invia eventi del mouse.
  • Funziona con Windows e Linux (richiede sudo).
  • Python puro, nessun modulo C da compilare.
  • Zero dipendenze. Trivial da installare e distribuire, basta copiare i file.
  • Python 2 e 3
  • Include API di alto livello (ad es. Registrazione e riproduzione.
  • Gli eventi acquisiti automaticamente in thread separati, non bloccano il programma principale.
  • Testato e documentato.

2

Se vuoi spostare il mouse, usa questo:

import pyautogui
pyautogui.moveTo(x,y)

Se vuoi fare clic, usa questo:

import pyautogui
pyautogui.click(x,y)

Se non hai pyautoguiinstallato, devi avere Python collegato a CMD. Vai a CMD e scrivi:pip install pyautogui

Questo verrà installato pyautogui per Python 2.x.

Per Python 3.x, probabilmente dovrai usare pip3 install pyautoguio python3 -m pip install pyautogui.


Ti consigliamo di chiamare pyautogui.moveTo(x, y)perché move()sposta il cursore rispetto alla sua posizione corrente.
Al Sweigart,

Ah, mi spiace di aver frainteso il tuo commento originale. Sì, entrambe le funzioni funzionano. moveTo()si sposta in una posizione assoluta, mentre si move()sposta in relazione alla posizione corrente del cursore.
Al Sweigart,

1

Un'altra alternativa sarebbe la libreria del mouse , la uso personalmente in quanto è relativamente semplice e multipiattaforma.

Ecco come puoi usarlo:

import mouse
# move 100 right and 100 down with a duration of 0.5 seconds
mouse.move(100, 100, absolute=False, duration=0.5)
# left click
mouse.click('left')
# right click
mouse.click('right')

Ecco la fonte: Come controllare il mouse in Python


1

La risposta accettata ha funzionato per me, ma era instabile (a volte i clic non venivano registrati), quindi ho aggiunto un MOUSEEVENTF_LEFTUP aggiuntivo . Quindi ha funzionato in modo affidabile

import win32api, win32con
def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
click(10,10)

0

Pacchetto 1-installazione molto semplice:

pip install mouse

2- aggiungi libreria al progetto:

import mouse

3- usalo ad esempio:

mouse.right_click()

in questo url descrivi tutte le funzioni che puoi usare:

https://github.com/boppreh/mouse

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.