Contrôle de la souris avec Python

206

Comment contrôler le curseur de la souris en Python, c'est-à-dire le déplacer vers une certaine position et cliquer, sous Windows?

Sasha
la source
1
Voulez-vous faire le mouvement de la souris dans le code sans intervention de l'utilisateur?
rahul
Plus d'informations seraient vraiment utiles ...
Gabriel Hurley
Je wotk dans Windows et je n'utilise aucune boîte à outils. Je suis vraiment nouveau sur Python et je n'ai jamais travaillé avec une interface graphique auparavant. D'où je commence? Quel manuel dois-je lire?
Sasha
2
pourquoi vous avez besoin d'un python pour le faire, vous pouvez le faire vous-même? sur une note plus sérieuse, pourquoi vous en avez besoin, quel est le but, un peu plus de détails serait super
Anurag Uniyal
2
Juste pour info si vous utilisez cela pour empêcher votre machine de se verrouiller, vous pourriez violer la politique de sécurité de votre entreprise ou organisation car c'est un moyen de contourner les propriétés de verrouillage automatique de l'ordinateur. Je l'ai utilisé à certains endroits sans problème, assurez-vous toujours de vérifier auprès de vos administrateurs Sys. J'ai vu des gens perdre leur emploi pour des choses mineures comme celle-ci.
AlienAnarchist

Réponses:

329

Testé sur WinXP, Python 2.6 (3.x également testé) après l'installation de pywin32 (pywin32-214.win32-py2.6.exe dans mon cas):

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
la source
11
win32api.SetCursorPos((x,y))est préférable d'être remplacé par win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))mon expérience pour une meilleure intégration avec d'autres applications telles que les jeux.
Falcon
1
@ ObsessiveSSOℲ décolle juste le drapeau MOUSEEVENTF_ABSOLUTE. pour plus de détails: msdn.microsoft.com/en-us/library/windows/desktop/…
Falcon
puis-je utiliser cette bibliothèque pour contrôler la vitesse / accélération de la souris?
Someone Someoneelse
Cela avait l'avantage de ne pas nécessiter l'installation (et l'examen de gestion et l'approbation associés) de modules Python non standard dans plus de 50 boîtes Windows (bornes d'affichage numérique).
brichins
4
testé en python3.xtravaux aussi, n'hésitez pas à modifier la réponse
WhatsThePoint
132

Essayez avec le module PyAutoGUI . C'est multiplateforme.

pip install pyautogui

Et donc:

import pyautogui
pyautogui.click(100, 100)

Il possède également d'autres fonctionnalités:

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

C'est beaucoup plus facile que de passer par tous les trucs win32con.

Al Sweigart
la source
14
Génial! C'est multi-plateforme!
les
Pyautogui est un excellent module, mais malheureusement très lent. Dans Ubuntu, il déplace le curseur 2-3 fois par seconde. Incroyable! Pyuserinput est 1000 fois plus rapide.
Vladyslav Savchenko
1
Pour les personnes essayant d'installer pyautogui, regardez ici stackoverflow.com/questions/5892297/… et assurez-vous de mettre sudo devant vos commandes si vous avez des problèmes d'autorisation.
retodaredevil
5
"PyAutoGUI est lent" en raison d'une fonction de sécurité qui ajoute une pause de 0,1 seconde après chaque appel. Si votre script est hors de contrôle, vous pouvez claquer la souris dans le coin supérieur gauche en 0,1 seconde pour l'arrêter. Pour désactiver cela, exécutez pyautogui.PAUSE = 0 (bien que ce ne soit pas recommandé, car vous ne pouvez pas utiliser la souris / le clavier pour arrêter le script.)
Al Sweigart
75

Vous pouvez utiliser win32apiou ctypesmodule pour utiliser des API win32 pour contrôler la souris ou n'importe quel GUI

Voici un exemple amusant pour contrôler la souris en utilisant 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 à l'aide de 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
la source
11
votre code ctypes a fonctionné pour moi sans aucune bibliothèque supplémentaire! (Python 2.6 sur Windows 7)
Intrepion
1
Sans utiliser de bibliothèque externe! Merci
Akshat Agarwal
2
Je vous remercie! Je ne peux pas supporter qu'il y ait comme 3 bibliothèques tierces avec lesquelles vous pouvez le faire, mais les 3 bibliothèques sont exaspérantes à installer ou à dépanner. Cette solution ctypes est la première solution native de python et elle fonctionne mieux que toutes les autres que j'ai rencontrées.
DuckPuncher
Où est la documentation SetCursorPos?
ArtOfWarfare
22

Une autre option consiste à utiliser le package AutoPy multiplateforme . Ce package a deux options différentes pour déplacer la souris:

Cet extrait de code déplace instantanément le curseur sur la position (200 200):

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

Si vous souhaitez plutôt que le curseur se déplace visiblement à travers l'écran vers un emplacement donné, vous pouvez utiliser la commande smooth_move:

import autopy
autopy.mouse.smooth_move(200,200)
Gwen
la source
21

Découvrez la plateforme croisée PyMouse: https://github.com/pepijndevos/PyMouse/

Fabio Varesano
la source
8
PyMouse a été remplacé par PyUserInput , correspond exactement à la demande, simple à utiliser et multiplateforme. Big +1
user336851
@ user336851, savez-vous comment tap spaceet tap screen shot keyen utilisant PyUswerInput?
user3768495
@ user336851, à ce moment PyUserInputest cassé. Je ne peux pas dire si cela fonctionne bien ou non car je n'arrive même pas à l'installer en raison de dépendances cassées.
DuckPuncher
20

Linux

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

Source: déplacement de la souris Python en 5 lignes de code (Linux uniquement) .

Simon
la source
20
Un google pour "Python contrôlant le mouvement de la souris" trouve maintenant cette page, comment meta.
Copas
2
Par souci d'exhaustivité, puisque la question demandait également de simuler les clics de souris, j'ajouterai: 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();l'appel sleep () entre la presse et le relâchement peut être requis ou non en fonction de l'application cible.
user336851
4
@Copas - Les résultats qui apparaissent dans votre Google ne veulent rien dire. Tu es dans une bulle. Cela apparaît dans une recherche DuckDuckGo pour le même terme - c'est quelque chose de réel. C'est quelque chose que tout le monde peut reproduire et voir par lui-même. C'est méta.
ArtOfWarfare
1
Pour contrôler la souris dans une session VNC, vous avez besoin du numéro d'affichage ainsi que "d = display.Display (': 1')" où: 1 est le numéro d'affichage.
Zafer
12

Pynput est la meilleure solution que j'ai trouvée, à la fois pour Windows et pour Mac. Super facile à programmer et fonctionne très bien.

Par exemple,

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
la source
J'ai juste essayé d'exécuter un ancien programme sur un ordinateur Windows et cela n'a pas fonctionné, veuillez donc le tester avant de l'utiliser. Ce programme prétend au moins soutenir les deux.
Pro Q
J'ai fait quelques tests, et il s'avère que mon problème était que sur Mac, avoir des flottants comme valeurs de coordonnées fonctionne très bien, mais sous Windows, les coordonnées doivent être des entiers. Ce module est multi-plateforme.
Pro Q
J'ai ajouté un problème au référentiel github pour voir s'ils peuvent l'améliorer: github.com/moses-palmer/pynput/issues/79
Pro Q
Il semble que le problème ait été résolu depuis.
Pro Q
8

Fonction rapide et sale qui fera un clic gauche n'importe où clickssur Windows 7 en utilisant la ctypesbibliothèque. Aucun téléchargement requis.

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
la source
7

À partir de 2020 , vous pouvez utiliser la souris :

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

Caractéristiques

  • Crochet d'événement global sur tous les périphériques de souris (capture les événements indépendamment de la focalisation).
  • Écoutez et envoie des événements de souris.
  • Fonctionne avec Windows et Linux (nécessite sudo).
  • Pure Python, aucun module C à compiler.
  • Zéro dépendances. Trivial pour installer et déployer, il suffit de copier les fichiers.
  • Python 2 et 3
  • Comprend une API de haut niveau (par exemple, enregistrer et jouer.
  • Les événements automatiquement capturés dans un thread séparé, ne bloquent pas le programme principal.
  • Testé et documenté.
CONvid19
la source
2

Si vous souhaitez déplacer la souris, utilisez ceci:

import pyautogui
pyautogui.moveTo(x,y)

Si vous voulez cliquer, utilisez ceci:

import pyautogui
pyautogui.click(x,y)

Si vous ne l'avez pas pyautoguiinstallé, vous devez avoir python attaché à CMD. Allez dans CMD et écrivez:pip install pyautogui

Cela sera installé pyautoguipour Python 2.x.

Pour Python 3.x, vous devrez probablement utiliser pip3 install pyautoguiou python3 -m pip install pyautogui.

Destruktor_11
la source
Vous voudrez appeler pyautogui.moveTo(x, y)car move()déplace le curseur par rapport à sa position actuelle.
Al Sweigart
Ah, désolé d'avoir mal compris votre commentaire d'origine. Oui, les deux fonctions fonctionnent. moveTo()se déplace vers un emplacement absolu, tandis que move()se déplace par rapport à l'emplacement actuel du curseur.
Al Sweigart
1

Une autre alternative serait la bibliothèque de souris , je l'utilise personnellement car elle est relativement simple et multiplateforme.

Voici comment vous pouvez l'utiliser:

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')

Voici la source: Comment contrôler votre souris en Python

rockikz
la source
1

La réponse acceptée a fonctionné pour moi, mais elle était instable (parfois, les clics ne s'inscrivaient pas), j'ai donc ajouté un MOUSEEVENTF_LEFTUP supplémentaire . Ensuite, cela fonctionnait de manière fiable

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
la source
0

très facile 1- installer le paquet:

pip install mouse

2- ajouter une bibliothèque au projet:

import mouse

3- utilisez-le par exemple:

mouse.right_click()

dans cette URL décrivez toutes les fonctions que vous pouvez utiliser:

https://github.com/boppreh/mouse

Mamal
la source