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.