Control del mouse con Python

206

¿Cómo se controla el cursor del mouse en Python, es decir, moverlo a cierta posición y hacer clic en Windows?

Sasha
fuente
1
¿Necesita hacer que el mouse se mueva en código sin intervención del usuario?
rahul
Más información sería muy útil ...
Gabriel Hurley
Trabajo en Windows y no uso ningún kit de herramientas. Soy realmente nuevo en Python y nunca antes había trabajado con ninguna GUI. De donde empiezo? ¿Qué manual debo leer?
Sasha
2
¿Por qué necesitas una pitón para hacer eso? ¿Puedes hacerlo tú mismo? En una nota más seria, por qué lo necesita, ¿cuál es el propósito, un poco más detalles serían grandes
Anurag Uniyal
2
Solo para su información, si está usando esto para evitar que su máquina se bloquee, podría estar violando la política de seguridad de su empresa u organización, ya que es un medio de eludir las propiedades de bloqueo automático de la computadora. He usado esto en algunos lugares, no hay problema, solo asegúrese de consultar con sus administradores de sistemas. He visto a personas perder sus trabajos por cosas menores como esta.
AlienAnarchist

Respuestas:

329

Probado en WinXP, Python 2.6 (3.x también probado) después de instalar pywin32 (pywin32-214.win32-py2.6.exe en mi 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)
Jeffrey Kemp
fuente
11
win32api.SetCursorPos((x,y))win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))En mi experiencia, es mejor reemplazarlo para una mejor integración con otras aplicaciones como los juegos.
Falcon
1
@ ObsessiveSSOℲ solo quita la bandera MOUSEEVENTF_ABSOLUTE. para más detalles: msdn.microsoft.com/en-us/library/windows/desktop/…
Falcon
¿Puedo usar esta biblioteca para controlar la velocidad / aceleración del mouse?
Someoneelse
Esto tenía la ventaja de no requerir la instalación (y la revisión y aprobación de la administración asociada) de módulos Python no estándar en más de 50 cajas de ventanas (quioscos de señalización digital).
brichins
44
probado en python3.xlas obras también, no dude en corregir la respuesta
WhatsThePoint
132

Pruebe con el módulo PyAutoGUI . Es multiplataforma.

pip install pyautogui

Y entonces:

import pyautogui
pyautogui.click(100, 100)

También tiene otras características:

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

Esto es mucho más fácil que pasar por todas las cosas de win32con.

Al Sweigart
fuente
14
¡Excelente! ¡Es multiplataforma!
les
Pyautogui es un gran módulo, pero desafortunadamente es muy lento. En Ubuntu mueve el cursor 2-3 veces por segundo. ¡Increíble! Pyuserinput es 1000 veces más rápido.
Vladyslav Savchenko
1
Para las personas que intentan instalar pyautogui, mire aquí stackoverflow.com/questions/5892297/... y asegúrese de poner sudo delante de sus comandos si tiene problemas con los permisos.
retodaredevil
55
"PyAutoGUI es lento" debido a una función de seguridad que agrega una pausa de 0.1 segundos después de cada llamada. Si su script está fuera de control, puede golpear el mouse en la esquina superior izquierda en esos 0.1 segundos para detenerlo. Para deshabilitar esto, ejecute pyautogui.PAUSE = 0 (aunque esto no se recomienda, porque no puede usar el mouse / teclado para detener el script).
Al Sweigart
75

Puedes usar win32apioctypes módulo para usar win32 apis para controlar el mouse o cualquier interfaz gráfica de usuario

Aquí hay un ejemplo divertido para controlar el 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 ctypes:

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
Anurag Uniyal
fuente
11
¡Su código ctypes funcionó para mí sin bibliotecas adicionales! (Python 2.6 en Windows 7)
intrepion
1
¡Sin el uso de ninguna biblioteca externa! Gracias
Akshat Agarwal
2
¡Gracias! No puedo soportar que haya como 3 bibliotecas de terceros con las que puede hacer esto, sin embargo, las 3 bibliotecas son molestas para instalar o solucionar problemas. Esta solución de ctypes es la primera solución nativa de Python y funciona mejor que cualquier otra que haya encontrado.
DuckPuncher
¿Dónde está la documentación SetCursorPos?
ArtOfWarfare
22

Otra opción es usar el paquete AutoPy multiplataforma . Este paquete tiene dos opciones diferentes para mover el mouse:

Este fragmento de código moverá instantáneamente el cursor a la posición (200,200):

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

Si, en cambio, desea que el cursor se mueva visiblemente por la pantalla a una ubicación determinada, puede usar el comando smooth_move:

import autopy
autopy.mouse.smooth_move(200,200)
Gwen
fuente
21

Echa un vistazo a la plataforma cruzada PyMouse: https://github.com/pepijndevos/PyMouse/

Fabio Varesano
fuente
8
PyMouse ha sido reemplazado por PyUserInput , se ajusta exactamente a la solicitud, es fácil de usar y multiplataforma. Big +1
user336851
@ user336851, ¿sabe cómo tap spacey tap screen shot keymediante PyUswerInput?
user3768495
@ user336851, en este momento PyUserInputestá roto. No puedo decir si funciona bien o no porque ni siquiera puedo hacer que se instale debido a dependencias rotas.
DuckPuncher
20

Linux

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

Fuente: movimiento del mouse Python en 5 líneas de código (solo Linux) .

Simón
fuente
20
Un google para "Python que controla el movimiento del mouse" ahora encuentra esta página, cómo meta.
Copas
2
En aras de la exhaustividad, dado que la pregunta también pedía simular los clics del mouse, agregaré: 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 llamada sleep () entre la prensa y la liberación puede o no ser requerida dependiendo de la aplicación de destino.
user336851
44
@Copas: los resultados que aparecen en su Google no significan nada. Estás en una burbuja Esto aparece en una búsqueda de DuckDuckGo para el mismo término, eso es algo real. Eso es algo que todos los demás pueden reproducir y ver por sí mismos. Eso es meta.
ArtOfWarfare
1
Para controlar el mouse en una sesión VNC, necesita el número de pantalla así como "d = display.Display (': 1')" donde: 1 es el número de pantalla.
Zafer
12

Pynput es la mejor solución que he encontrado, tanto para Windows como para Mac. Súper fácil de programar y funciona muy bien.

Por ejemplo,

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)
Pro Q
fuente
Intenté ejecutar un programa antiguo en una computadora con Windows y no funcionó, así que pruébelo antes de usarlo. Este programa al menos afirma ser compatible con ambos.
Pro Q
Hice algunas pruebas, y resultó que mi problema era que en Mac, tener flotantes como valores de coordenadas funciona bien, pero en Windows, las coordenadas deben ser enteros. Este módulo es multiplataforma.
Pro Q
He agregado un Issue al repositorio de github para ver si pueden mejorarlo: github.com/moses-palmer/pynput/issues/79
Pro Q
Parece que el problema ya se ha solucionado.
Pro Q
8

Función rápida y sucia que hará clic izquierdo en cualquier clicksmomento en Windows 7 usando la ctypesbiblioteca. No se requieren descargas.

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.
TankorSmash
fuente
7

A partir de 2020 , puede usar el mouse :

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

Caracteristicas

  • Gancho de evento global en todos los dispositivos de mouse (captura eventos independientemente del foco).
  • Escucha y envía eventos del mouse.
  • Funciona con Windows y Linux (requiere sudo).
  • Python puro, no hay módulos C para compilar.
  • Cero dependencias. Trivial para instalar e implementar, solo copie los archivos.
  • Python 2 y 3
  • Incluye API de alto nivel (por ejemplo, grabar y reproducir).
  • Eventos capturados automáticamente en un hilo separado, no bloquea el programa principal.
  • Probado y documentado.
CONvid19
fuente
2

Si desea mover el mouse, use esto:

import pyautogui
pyautogui.moveTo(x,y)

Si desea hacer clic, use esto:

import pyautogui
pyautogui.click(x,y)

Si no lo ha pyautoguiinstalado, debe tener Python conectado a CMD. Vaya a CMD y escriba:pip install pyautogui

Esto se instalará pyautoguipara Python 2.x.

Para Python 3.x, probablemente tendrá que usar pip3 install pyautoguio python3 -m pip install pyautogui.

Destruktor_11
fuente
Querrá llamar pyautogui.moveTo(x, y)porque move()mueve el cursor en relación con su posición actual.
Al Sweigart
Ah, lo siento, entendí mal tu comentario original. Sí, ambas funciones funcionan. moveTo()se mueve a una ubicación absoluta, mientras que se move()mueve en relación con la ubicación actual del cursor.
Al Sweigart
1

Otra alternativa sería la biblioteca de mouse , personalmente la uso, ya que es relativamente simple y multiplataforma.

Así es como puedes 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')

Aquí está la fuente: Cómo controlar su mouse en Python

rockikz
fuente
1

La respuesta aceptada funcionó para mí, pero era inestable (a veces los clics no se registraban), así que agregué un MOUSEEVENTF_LEFTUP adicional . Entonces estaba funcionando de manera confiable

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)
KoKlA
fuente
0

muy fácil 1- instalar pakage:

pip install mouse

2- agregar biblioteca al proyecto:

import mouse

3- úsalo por ejemplo:

mouse.right_click()

en esta url describa todas las funciones que puede usar:

https://github.com/boppreh/mouse

mamal
fuente