Sterowanie myszą za pomocą Pythona


206

Jak kontrolować kursor myszy w Pythonie, tj. Przesuwać go do określonej pozycji i klikać pod Windows?


1
Czy chcesz, aby mysz poruszała się w kodzie bez interwencji użytkownika?
— rahul

Więcej informacji byłoby naprawdę pomocne ...
— Gabriel Hurley,

Pracuję w systemie Windows i nie używam żadnego zestawu narzędzi. Jestem naprawdę nowy w Pythonie i nigdy wcześniej nie pracowałem z żadnym GUI. Skąd zacznę? Jaki mannual powinienem przeczytać?
— Sasha

2
dlaczego potrzebujesz do tego Pythona, możesz to zrobić sam? bardziej poważnie, dlaczego potrzebujesz, jaki jest cel, trochę więcej szczegółów byłoby świetnych
— Anurag Uniyal

2
Tylko FYI, jeśli używasz tego, aby zapobiec blokowaniu komputera, możesz naruszać zasady bezpieczeństwa firmy lub organizacji, ponieważ jest to sposób na obejście właściwości automatycznego blokowania komputera. Użyłem tego w niektórych miejscach, nie ma problemu, po prostu zawsze upewnij się, że skonsultujesz się z administratorami Sys. Widziałem, jak ludzie tracą pracę z powodu takich drobnych spraw.
— AlienAnarchist

Odpowiedzi:


329

Testowany na WinXP, Python 2.6 (3.x również przetestowany) po zainstalowaniu pywin32 (w moim przypadku 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)

11
win32api.SetCursorPos((x,y))z win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))mojego doświadczenia lepiej jest zostać zastąpionym przez dla lepszej integracji z innymi aplikacjami, takimi jak gry.
— Falcon

1
@ ObsessiveSSOℲ po prostu zdejmij flagę MOUSEEVENTF_ABSOLUTE. szczegółowe informacje: msdn.microsoft.com/en-us/library/windows/desktop/…
— Falcon

czy mogę użyć tej biblioteki do sterowania prędkością / przyspieszeniem myszy?
— Ktoś Someoneelse

Miało to tę zaletę, że nie wymagało instalacji (i związanego z tym przeglądu zarządzania i zatwierdzania) niestandardowych modułów Python w ponad 50 oknach (kioski z cyfrowym oznakowaniem).
— brichins

4
przetestowany również w python3.xpracach, możesz edytować odpowiedź
— WhatsThePoint

132

Spróbuj z modułem PyAutoGUI . Jest wieloplatformowy.

pip install pyautogui

A więc:

import pyautogui
pyautogui.click(100, 100)

Ma również inne funkcje:

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

Jest to o wiele łatwiejsze niż przeglądanie wszystkich rzeczy związanych z win32con.


14
Wspaniały! To wieloplatformowe!
— les

Pyautogui to świetny moduł, ale niestety bardzo wolny. W Ubuntu przesuwa kursor 2-3 razy na sekundę. Niesamowite! Pyuserinput jest 1000 razy szybszy.
— Vladyslav Savchenko

1
Dla osób próbujących zainstalować pyautogui, zajrzyj tutaj stackoverflow.com/questions/5892297/... i upewnij się, że ustawiłeś sudo przed poleceniami, jeśli masz problemy z uprawnieniami.
— retodaredevil,

5
„PyAutoGUI jest wolny” ze względu na funkcję bezpieczeństwa, która dodaje 0,1 sekundy przerwy po każdym połączeniu. Jeśli twój skrypt wymyka się spod kontroli, możesz wcisnąć mysz do lewego górnego rogu w ciągu 0,1 sekundy, aby go zatrzymać. Aby to wyłączyć, uruchom pyautogui.PAUSE = 0 (chociaż nie jest to zalecane, ponieważ nie można użyć myszy / klawiatury do zatrzymania skryptu).
— Al Sweigart

76

Możesz użyć win32apilub ctypesmodułu, aby używać interfejsu API Win32 do sterowania myszą lub dowolnym GUI

Oto zabawny przykład sterowania myszą za pomocą 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)

Kliknięcie za pomocą ctypów:

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
twój kod ctypes działał dla mnie bez żadnych dodatkowych bibliotek! (python 2.6 w Windows 7)
— intrepion

1
Bez użycia zewnętrznej biblioteki! Dziękuję
— Akshat Agarwal

2
Dziękuję Ci! Nie mogę znieść, że istnieją 3 biblioteki innych firm, z którymi można to zrobić, jednak wszystkie 3 biblioteki szaleją przy instalowaniu lub rozwiązywaniu problemów. To rozwiązanie ctypes jest pierwszym rodzimym rozwiązaniem Pythona i działa lepiej niż wszystkie inne, z którymi się spotkałem.
— DuckPuncher

Gdzie jest dokumentacja SetCursorPos?
— ArtOfWarfare

22

Inną opcją jest użycie wieloplatformowego pakietu AutoPy . Ten pakiet ma dwie różne opcje poruszania myszą:

Ten fragment kodu natychmiast przeniesie kursor do pozycji (200,200):

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

Jeśli zamiast tego chcesz, aby kursor widocznie przesuwał się po ekranie do określonej lokalizacji, możesz użyć polecenia smooth_move:

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

21

Sprawdź cross-platform PyMouse: https://github.com/pepijndevos/PyMouse/


8
PyMouse został zastąpiony przez PyUserInput , pasuje dokładnie do żądania, jest łatwy w użyciu i obsługuje wiele platform. Duża +1
— użytkownik336851

@ user336851, czy wiesz jak tap spacei tap screen shot keyużywając PyUswerInput?
— user3768495,

@ user336851, W tej chwili PyUserInputjest zepsuty. Nie mogę powiedzieć, czy działa dobrze, czy nie, ponieważ nie mogę go nawet zainstalować z powodu zepsutych zależności.
— DuckPuncher

20

Linux

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

Źródło: Mysz Python porusza się w 5 liniach kodu (tylko Linux) .


20
Google dla „Python kontrolujący ruch myszy” znajduje teraz tę stronę, jak meta.
— Copas

2
Ze względu na kompletność, ponieważ pytanie zadawano również w celu symulacji kliknięć myszą, dodam: 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();wywołanie sleep () między naciśnięciem a zwolnieniem może, ale nie musi być wymagane w zależności od docelowej aplikacji.
— user336851

4
@Copas - wyniki wyświetlane w Google nic nie znaczą. Jesteś w bańce. To pojawia się w wyszukiwaniu tego samego terminu w DuckDuckGo - to coś prawdziwego. To jest coś, co wszyscy inni mogą reprodukować i zobaczyć na własne oczy. To jest meta.
— ArtOfWarfare

1
Do sterowania myszą w sesji VNC potrzebny jest również numer wyświetlacza, na przykład „d = display.Display (': 1')”, gdzie: 1 to numer wyświetlacza.
— Zafer

12

Pynput to najlepsze rozwiązanie, jakie znalazłem, zarówno dla systemu Windows, jak i Mac. Bardzo łatwy w programowaniu i działa bardzo dobrze.

Na przykład,

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)

Właśnie próbowałem uruchomić stary program na komputerze z systemem Windows i nie działał, więc proszę przetestować go przed użyciem. Ten program przynajmniej twierdzi, że obsługuje oba te elementy.
— Pro Q

Przeprowadziłem testy i okazało się, że mój problem polegał na tym, że na komputerze Mac wartości zmiennoprzecinkowe działają poprawnie, ale w systemie Windows współrzędne muszą być liczbami całkowitymi. Ten moduł jest wieloplatformowy.
— Pro Q

Dodałem problem do repozytorium github, aby sprawdzić, czy można go poprawić: github.com/moses-palmer/pynput/issues/79
— Pro Q

Wygląda na to, że problem został już rozwiązany.
— Pro Q

8

Szybka i brudna funkcja, która kliknie lewym przyciskiem myszy w dowolnym miejscu clicksw systemie Windows 7 za pomocą ctypesbiblioteki. Nie wymaga pobierania.

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

Od 2020 r. Możesz używać myszy :

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

cechy

  • Globalny hak zdarzeń na wszystkich urządzeniach myszy (rejestruje zdarzenia bez względu na fokus).
  • Słuchaj i wysyła zdarzenia myszy.
  • Działa z systemami Windows i Linux (wymaga sudo).
  • Czysty Python, żadnych modułów C do skompilowania.
  • Zero zależności. Trywialne w instalacji i wdrożeniu, wystarczy skopiować pliki.
  • Python 2 i 3
  • Obejmuje interfejs API wysokiego poziomu (np. Nagrywanie i odtwarzanie).
  • Zdarzenia automatycznie przechwytywane w osobnym wątku, nie blokują programu głównego.
  • Przetestowane i udokumentowane.

2

Jeśli chcesz poruszyć myszą, użyj tego:

import pyautogui
pyautogui.moveTo(x,y)

Jeśli chcesz kliknąć, użyj tego:

import pyautogui
pyautogui.click(x,y)

Jeśli nie masz pyautoguizainstalowanego, musisz mieć Python podłączony do CMD. Przejdź do CMD i napisz:pip install pyautogui

To zainstaluje się pyautoguidla Python 2.x.

W przypadku Python 3.x prawdopodobnie będziesz musiał użyć pip3 install pyautoguilub python3 -m pip install pyautogui.


Będziesz chciał zadzwonić, pyautogui.moveTo(x, y)ponieważ move()przesuwa kursor względem bieżącej pozycji.
— Al Sweigart,

Ach, przepraszam, nie zrozumiałem twojego oryginalnego komentarza. Tak, obie funkcje działają. moveTo()przesuwa się do położenia bezwzględnego, natomiast move()przesuwa się względem bieżącego położenia kursora.
— Al Sweigart

1

Inną alternatywą byłaby biblioteka myszy , ja osobiście z niej korzystam, ponieważ jest stosunkowo prosta i wieloplatformowa.

Oto jak możesz go użyć:

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

Oto źródło: Jak kontrolować mysz w Pythonie


1

Przyjęta odpowiedź działała dla mnie, ale była niestabilna (czasami kliknięcia nie rejestrowały się), więc dodałem dodatkowy MOUSEEVENTF_LEFTUP . Potem działało niezawodnie

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

bardzo łatwy 1- pakiet instalacyjny:

pip install mouse

2- dodaj bibliotekę do projektu:

import mouse

3- użyj go na przykład:

mouse.right_click()

w tym adresie URL opisz wszystkie funkcje, których możesz użyć:

https://github.com/boppreh/mouse

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.