Python ile fareyi kontrol etme


206

Python'da fare imlecini nasıl kontrol eder, yani Windows altında belirli bir konuma taşıyın ve tıklayın?


1
Kullanıcı müdahalesi olmadan kodda fare hareketi yapmak için ne gerekiyor?
rahul

Daha fazla bilgi gerçekten yardımcı olur ...
Gabriel Hurley

Windows'da çalışıyorum ve herhangi bir araç takımı kullanmıyorum. Python için gerçekten yeniyim ve daha önce hiç GUI ile çalışmadım. Nereden başlamalıyım? Hangi manneli okumalıyım?
Sasha

2
bunu yapmak için neden bir pitona ihtiyacınız var, bunu kendiniz yapabilirsiniz? daha ciddi bir not, neden ihtiyacınız var, amaç nedir, biraz daha fazla ayrıntı harika olurdu
Anurag Uniyal

2
Makinenizi kilitlemekten korumak için bunu kullanıyorsanız, otomatik bilgisayar kilitleme özelliklerini atlatmanın bir yolu olduğu için şirketinizin veya kuruluşlarınızın güvenlik politikasını ihlal ediyor olabilirsiniz. Ive bazı yerlerde kullandım sorun yok sadece her zaman Sys Yöneticiler ile kontrol emin olun. İnsanların bu gibi küçük şeyler yüzünden işlerini kaybettiğini gördüm.
AlienAnarchist

Yanıtlar:


329

Pywin32 (pywin32-214.win32-py2.6.exe benim durumumda) yüklendikten sonra WinXP, Python 2.6 (3.x de test edildi) üzerinde test edildi :

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))win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))oyun gibi diğer uygulamalarla daha iyi entegrasyon için deneyimimde yerini almak daha iyidir.
Falcon

1
@ ObsessiveSSOℲ sadece MOUSEEVENTF_ABSOLUTE bayrağını çıkar. ayrıntılar için: msdn.microsoft.com/en-us/library/windows/desktop/…
Falcon

hızını / hızını kontrol etmek için bu kütüphaneyi kullanabilir miyim?
Birisi Birisi

Bunun avantajı, standart olmayan Python modüllerinin 50'den fazla pencere kutusu (dijital tabela kioskları) arasında kurulmasını (ve ilişkili yönetim gözden geçirmesini ve onayını) gerektirmemesidir.
brichins

4
python3.xçalışmalarda da test edildi , cevabı düzenlemek için çekinmeyin
WhatsThePoint

132

PyAutoGUI modülünü deneyin . Çok platformlu.

pip install pyautogui

Ve bu yüzden:

import pyautogui
pyautogui.click(100, 100)

Ayrıca başka özellikleri de vardır:

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

Bu, tüm win32con öğelerinden geçmekten çok daha kolay.


14
Harika! Çok platformlu!
les

Pyautogui harika bir modül ama maalesef çok yavaş. Ubuntu'da imleci saniyede 2-3 kez hareket ettirir. İnanılmaz! Pyuserinput 1000 kat daha hızlıdır.
Vladyslav Savchenko

1
Pyautogui'yi yüklemeye çalışan insanlar için buraya bakın stackoverflow.com/questions/5892297/… ve izin sorunlarınız varsa sudo'yu komutlarınızın önüne koyduğunuzdan emin olun.
retodaredevil

5
Her çağrıdan sonra 0,1 saniye duraklama ekleyen bir güvenlik özelliği nedeniyle "PyAutoGUI yavaştır". Betiğiniz kontrol dışıysa, durdurmak için fareyi sol üst köşeye 0,1 saniyede çarpabilirsiniz. Bunu devre dışı bırakmak için pyautogui.PAUSE = 0 komutunu çalıştırın (bu önerilmez, çünkü komut dosyasını durdurmak için fare / klavyeyi kullanamazsınız.)
Al Sweigart

76

Fare veya herhangi bir GUI'yi kontrol etmek için win32 apis'i kullanmak için win32apiveya ctypesmodülünü kullanabilirsiniz

İşte win32api kullanarak fareyi kontrol etmek için eğlenceli bir örnek:

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)

Ctypes kullanan bir tıklama:

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
ctypes kodunuz herhangi bir ek kütüphane olmadan benim için çalıştı! (Windows 7'de Python 2.6)
2010'da

1
Herhangi bir harici kütüphane kullanmadan! Teşekkür ederim
Akshat Agarwal

2
Teşekkür ederim! Bunu yapabileceğiniz 3 3. parti kitaplığı olduğu konusunda dayanamıyorum, ancak 3 kitaplığın tümü yüklemek veya sorun gidermek için çıldırıyor. Bu ctypes çözümü ilk yerli python çözümüdür ve karşılaştığım diğerlerinden daha iyi çalışır.
DuckPuncher

Belgeler nerede SetCursorPos?
ArtOfWarfare

22

Diğer bir seçenek, platformlar arası AutoPy paketini kullanmaktır . Bu paketin fareyi hareket ettirmek için iki farklı seçeneği vardır:

Bu kod pasajı imleci anında (200,200) konumuna getirecektir:

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

Bunun yerine imlecin ekran boyunca belirli bir konuma görünür bir şekilde hareket etmesini istiyorsanız smooth_move komutunu kullanabilirsiniz:

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

21

Çapraz platform PyMouse'a göz atın: https://github.com/pepijndevos/PyMouse/


8
PyMouse, PyUserInput ile değiştirildi , tam olarak isteğe uyar, kullanımı kolay ve çapraz platform. Büyük +1
user336851

@ user336851, PyUswerInput'un nasıl tap spaceve nasıl tap screen shot keykullanılacağını biliyor musunuz?
user3768495

@ user336851, Şu anda PyUserInputbozuk. İyi çalışıp çalışmadığını söyleyemem çünkü kırık bağımlılıklar nedeniyle yüklemeyi bile alamıyorum.
DuckPuncher

20

Linux

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

Kaynak: Python mouse 5 satırlık kodda hareket eder (sadece Linux) .


20
"Python fare hareketini kontrol" için bir google şimdi bu sayfayı nasıl meta bulur.
Copas

2
Tamlık uğruna, soru da fare tıklamalarını simüle etmeyi istediğinden, şunu ekleyeceğim: 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();hedef uygulamaya bağlı olarak, basın ve bırakma arasındaki uyku () çağrısı gerekebilir veya gerekmeyebilir.
user336851

4
@Copas - Google'ınızda görünen sonuçlar hiçbir şey ifade etmiyor. Baloncuktasın. Bu, aynı terim için DuckDuckGo aramasında ortaya çıkıyor - bu gerçek bir şey. Bu herkesin üretebileceği ve kendileri için görebileceği bir şey. Bu meta.
ArtOfWarfare

1
Bir VNC oturumunda fareyi kontrol etmek için "d = display.Display (': 1')" gibi ekran numarasına ihtiyacınız vardır; burada: 1 ekran numarasıdır.
Zafer

12

Pynput , hem Windows hem de Mac için bulduğum en iyi çözüm. Süper programlaması kolay ve çok iyi çalışıyor.

Örneğin,

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)

Sadece bir Windows bilgisayarda eski bir program çalıştırmayı denedim ve işe yaramadı, bu yüzden lütfen kullanmadan önce test edin. Bu program en azından her ikisini de desteklediğini iddia ediyor.
Pro Q

Bazı testler yaptım ve sorunum Mac'te, koordinat değerleri olarak kayanların iyi çalıştığı, ancak Windows'ta koordinatların tamsayı olması gerektiği ortaya çıktı. Bu modül çapraz platformdur.
Pro Q


Sorun o zamandan beri giderilmiş gibi görünüyor.
Pro Q

8

Kitaplığı clickskullanarak Windows 7'de herhangi bir yere sol tıklayacak hızlı ve kirli işlev ctypes. İndirme gerekmez.

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

İtibariyle 2020 kullanabileceğiniz fare :

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

Özellikleri

  • Tüm fare cihazlarında global olay kancası (odaktan bağımsız olarak olayları yakalar).
  • Dinleyin ve fare olaylarını gönderir.
  • Windows ve Linux ile çalışır (sudo gerektirir).
  • Saf Python, derlenecek C modülü yok.
  • Sıfır bağımlılıklar. Yüklemek ve dağıtmak önemsiz, sadece dosyaları kopyalayın.
  • Python 2 ve 3
  • Yüksek seviye API içerir (örneğin kayıt ve oynatma).
  • Olaylar otomatik olarak ayrı bir iş parçacığında yakalanır, ana programı engellemez.
  • Test edildi ve belgelendi.

2

Fareyi hareket ettirmek istiyorsanız, şunu kullanın:

import pyautogui
pyautogui.moveTo(x,y)

Tıklamak istiyorsanız, şunu kullanın:

import pyautogui
pyautogui.click(x,y)

Eğer var yoksa pyautoguiyüklediğinizi CMD bağlı python olması gerekir. CMD'ye gidin ve şunu yazın:pip install pyautogui

Bu pyautoguiPython 2.x için yüklenecektir .

Python 3.x için muhtemelen pip3 install pyautoguiveya kullanmanız gerekecektir python3 -m pip install pyautogui.


Aramak isteyeceksiniz pyautogui.moveTo(x, y)çünkü move()imleci geçerli konumuna göre hareket ettirir.
Al Sweigart

Ah, özür dilerim orijinal yorumunuzu yanlış anladım. Evet, her iki işlev de çalışır. moveTo()mutlak bir konuma taşırken move()geçerli imleç konumuna göre hareket eder.
Al Sweigart

1

Başka bir alternatif fare kütüphanesi olurdu , şahsen nispeten basit ve çapraz platform olduğu için kullanıyorum.

İşte nasıl kullanabilirsiniz:

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

İşte kaynak: Python'da Farenizi Kontrol Etme


1

Kabul edilen cevap benim için çalıştı ama kararsız (bazen tıklama regsiter olmaz) bu yüzden ek bir MOUSEEVENTF_LEFTUP ekledim . Sonra güvenilir bir şekilde çalışıyordu

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

çok kolay 1-pakage yükleyin:

pip install mouse

2- Projeye kütüphane ekleyin:

import mouse

3- örneğin kullanın:

mouse.right_click()

bu url'de kullanabileceğiniz tüm işlevleri açıklayın:

https://github.com/boppreh/mouse

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.