Maus mit Python steuern

206

Wie steuert man den Mauszeiger in Python, dh bewegt man ihn an eine bestimmte Position und klickt unter Windows?

Sasha
quelle
1
Müssen Sie die Mausbewegung im Code ohne Benutzereingriff ausführen?
Rahul
Weitere Informationen wären wirklich hilfreich ...
Gabriel Hurley
Ich wotk in Windows und ich benutze kein Toolkit. Ich bin wirklich neu in Python und habe noch nie mit einer GUI gearbeitet. Wo fange ich an? Welches Handbuch soll ich lesen?
Sasha
2
Warum brauchst du dafür eine Python? Kannst du das selbst? im Ernst, warum Sie es brauchen, was der Zweck ist, ein bisschen mehr Details wären großartig
Anurag Uniyal
2
Nur zu Ihrer Information, wenn Sie dies verwenden, um das Sperren Ihres Computers zu verhindern, könnten Sie gegen die Sicherheitsrichtlinien Ihres Unternehmens oder Ihrer Organisation verstoßen, da dies ein Mittel zur Umgehung der Eigenschaften der automatischen Computersperre ist. Ich habe dies an einigen Stellen problemlos verwendet. Fragen Sie einfach immer bei Ihren Sys-Administratoren nach. Ich habe gesehen, wie Leute wegen kleinerer Dinge wie diesen ihren Job verloren haben.
AlienAnarchist

Antworten:

329

Getestet unter WinXP, Python 2.6 (3.x ebenfalls getestet) nach der Installation von pywin32 (in meinem Fall pywin32-214.win32-py2.6.exe):

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
quelle
11
win32api.SetCursorPos((x,y))ist win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))meiner Erfahrung nach besser zu ersetzen, um eine bessere Integration mit anderen Anwendungen wie Spielen zu erreichen.
Falcon
1
@ ObsessiveSSOℲ entferne einfach das MOUSEEVENTF_ABSOLUTE-Flag. Für Details: msdn.microsoft.com/en-us/library/windows/desktop/…
Falcon
Kann ich diese Bibliothek verwenden, um die Geschwindigkeit / Beschleunigung der Maus zu steuern?
Jemand Someoneelse
Dies hatte den Vorteil, dass keine Installation (und damit verbundene Überprüfung und Genehmigung durch das Management) von nicht standardmäßigen Python-Modulen in mehr als 50 Windows-Boxen (Digital Signage Kiosks) erforderlich war.
Brichins
4
Auch in python3.xWerken getestet , können Sie die Antwort
jederzeit
132

Versuchen Sie es mit dem PyAutoGUI- Modul. Es ist Multiplattform.

pip install pyautogui

Und so:

import pyautogui
pyautogui.click(100, 100)

Es hat auch andere Funktionen:

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

Dies ist viel einfacher als das ganze win32con-Zeug durchzugehen.

Al Sweigart
quelle
14
Toll! Es ist plattformübergreifend!
Les
Pyautogui ist ein großartiges Modul, aber leider sehr langsam. In Ubuntu bewegt es den Cursor 2-3 mal pro Sekunde. Unglaublich! Pyuserinput ist 1000x schneller.
Vladyslav Savchenko
1
Wenn Sie versuchen, pyautogui zu installieren, schauen Sie hier auf stackoverflow.com/questions/5892297/… und stellen Sie sudo vor Ihre Befehle, wenn Sie Berechtigungsprobleme haben.
Retodaredevil
5
"PyAutoGUI ist langsam" aufgrund einer Sicherheitsfunktion, die nach jedem Anruf eine Pause von 0,1 Sekunden hinzufügt. Wenn Ihr Skript außer Kontrolle gerät, können Sie die Maus in diesen 0,1 Sekunden in die obere linke Ecke bewegen, um es zu stoppen. Um dies zu deaktivieren, führen Sie pyautogui.PAUSE = 0 aus (obwohl dies nicht empfohlen wird, da Sie das Skript nicht mit der Maus / Tastatur stoppen können.)
Al Sweigart
76

Sie können win32 apis verwenden win32apioder ctypesmodulieren, um die Maus oder eine beliebige GUI zu steuern

Hier ist ein unterhaltsames Beispiel für die Steuerung der Maus mit 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)

Ein Klick mit 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
quelle
11
Ihr ctypes-Code hat bei mir ohne zusätzliche Bibliotheken funktioniert! (Python 2.6 unter Windows 7)
Intrepion
1
Ohne Verwendung einer externen Bibliothek! Vielen Dank
Akshat Agarwal
2
Danke dir! Ich kann es nicht ertragen, dass es 3 Bibliotheken von Drittanbietern gibt, mit denen Sie dies tun können, aber alle 3 Bibliotheken sind verrückt nach Installation oder Fehlerbehebung. Diese ctypes-Lösung ist die erste native Python-Lösung und funktioniert besser als jede andere, die mir begegnet ist.
DuckPuncher
Wo ist die Dokumentation für SetCursorPos?
ArtOfWarfare
22

Eine weitere Option ist die Verwendung des plattformübergreifenden AutoPy-Pakets . Dieses Paket bietet zwei verschiedene Optionen zum Bewegen der Maus:

Dieses Code-Snippet bewegt den Cursor sofort auf Position (200.200):

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

Wenn Sie stattdessen möchten, dass sich der Cursor sichtbar über den Bildschirm zu einer bestimmten Position bewegt, können Sie den Befehl glatt_move verwenden:

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

Schauen Sie sich die plattformübergreifende PyMouse an: https://github.com/pepijndevos/PyMouse/

Fabio Varesano
quelle
8
PyMouse wurde durch PyUserInput ersetzt , entspricht genau der Anforderung, ist einfach zu bedienen und plattformübergreifend. Big +1
user336851
@ user336851, wissen Sie, wie tap spaceund tap screen shot keymit PyUswerInput?
user3768495
@ user336851, Zur Zeit PyUserInputist kaputt. Ich kann nicht sagen, ob es gut funktioniert oder nicht, da ich es aufgrund defekter Abhängigkeiten nicht einmal zur Installation bringen kann.
DuckPuncher
20

Linux

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

Quelle: Python-Mausbewegung in 5 Codezeilen (nur Linux) .

Simon
quelle
20
Ein Google für "Python steuert die Mausbewegung" findet nun diese Seite, wie Meta.
Copas
2
Der Vollständigkeit halber füge ich hinzu, da die Frage auch zur Simulation von Mausklicks gestellt wurde: 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();Der Aufruf von sleep () zwischen Druck und Veröffentlichung kann je nach Zielanwendung erforderlich sein oder auch nicht.
user336851
4
@Copas - Ergebnisse, die in Ihrem Google angezeigt werden, bedeuten nichts. Du bist in einer Blase. Dies zeigt sich in einer DuckDuckGo-Suche nach demselben Begriff - das ist etwas Reales. Das können alle anderen reproduzieren und selbst sehen. Das ist Meta.
ArtOfWarfare
1
Um die Maus in einer VNC-Sitzung zu steuern, benötigen Sie die Anzeigenummer sowie "d = display.Display (': 1')", wobei: 1 die Anzeigenummer ist.
Zafer
12

Pynput ist die beste Lösung, die ich gefunden habe, sowohl für Windows als auch für Mac. Super einfach zu programmieren und funktioniert sehr gut.

Beispielsweise,

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.
quelle
Ich habe gerade versucht, ein altes Programm auf einem Windows-Computer auszuführen, aber es hat nicht funktioniert. Testen Sie es daher vor der Verwendung. Dieses Programm behauptet zumindest, beide zu unterstützen.
Pro Q
Ich habe einige Tests durchgeführt, und es stellte sich heraus, dass mein Problem darin bestand, dass auf einem Mac Gleitkommazahlen als Koordinatenwerte einwandfrei funktionieren. Unter Windows müssen die Koordinaten jedoch Ganzzahlen sein. Dieses Modul ist plattformübergreifend.
Pro Q
Ich habe dem Github-Repository ein Problem hinzugefügt, um zu sehen, ob es verbessert werden kann: github.com/moses-palmer/pynput/issues/79
Pro Q
Es sieht so aus, als ob das Problem inzwischen behoben wurde.
Pro Q
8

Schnelle und schmutzige Funktion, die unter clicksWindows 7 überall mit der ctypesBibliothek mit der linken Maustaste klickt . Keine Downloads erforderlich.

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
quelle
7

Ab 2020 können Sie die Maus verwenden :

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

Eigenschaften

  • Globaler Ereignis-Hook auf allen Mäusegeräten (erfasst Ereignisse unabhängig vom Fokus).
  • Hören Sie zu und senden Sie Mausereignisse.
  • Funktioniert mit Windows und Linux (erfordert Sudo).
  • Pure Python, keine zu kompilierenden C-Module.
  • Keine Abhängigkeiten. Einfach zu installieren und bereitzustellen, kopieren Sie einfach die Dateien.
  • Python 2 und 3
  • Enthält eine API auf hoher Ebene (z. B. Aufnehmen und Abspielen).
  • Ereignisse, die automatisch in einem separaten Thread erfasst werden, blockieren das Hauptprogramm nicht.
  • Getestet und dokumentiert.
CONvid19
quelle
2

Wenn Sie die Maus bewegen möchten, verwenden Sie Folgendes:

import pyautogui
pyautogui.moveTo(x,y)

Wenn Sie klicken möchten, verwenden Sie Folgendes:

import pyautogui
pyautogui.click(x,y)

Wenn Sie nicht pyautoguiinstalliert haben, muss Python an CMD angehängt sein. Gehen Sie zu CMD und schreiben Sie:pip install pyautogui

Dies wird pyautoguifür Python 2.x installiert .

Für Python 3.x müssen Sie wahrscheinlich pip3 install pyautoguioder verwenden python3 -m pip install pyautogui.

Destruktor_11
quelle
Sie möchten anrufen, pyautogui.moveTo(x, y)da move()sich der Cursor relativ zur aktuellen Position bewegt.
Al Sweigart
Ah, tut mir leid, dass ich Ihren ursprünglichen Kommentar falsch verstanden habe. Ja, beide Funktionen funktionieren. moveTo()bewegt sich zu einer absoluten Position, während move()relativ zur aktuellen Cursorposition verschoben wird.
Al Sweigart
1

Eine andere Alternative wäre die Mausbibliothek , die ich persönlich benutze, da sie relativ einfach und plattformübergreifend ist.

So können Sie es verwenden:

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

Hier ist die Quelle: So steuern Sie Ihre Maus in Python

rockikz
quelle
1

Die akzeptierte Antwort funktionierte für mich, war aber instabil (manchmal wurden Klicks nicht registriert), sodass ich ein zusätzliches MOUSEEVENTF_LEFTUP hinzufügte . Dann funktionierte es zuverlässig

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
quelle
0

sehr einfach 1- Paket installieren:

pip install mouse

2- Bibliothek zum Projekt hinzufügen:

import mouse

3- Verwenden Sie es zum Beispiel:

mouse.right_click()

Beschreiben Sie in dieser URL alle Funktionen, die Sie verwenden können:

https://github.com/boppreh/mouse

Säugetier
quelle