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.