Kiểm soát chuột bằng Python


206

Làm thế nào để một người điều khiển con trỏ chuột trong Python, tức là di chuyển nó đến vị trí nhất định và nhấp, trong Windows?


1
Bạn có muốn thực hiện chuyển động chuột trong mã mà không cần sự can thiệp của người dùng không?
rahul

Thêm thông tin sẽ thực sự hữu ích ...
Gabriel Hurley

Tôi wotk trong Windows và tôi không sử dụng bất kỳ bộ công cụ nào. Tôi thực sự mới với Python và tôi chưa bao giờ làm việc với bất kỳ GUI nào trước đây. Tôi bắt đầu từ đâu? Tôi nên đọc những gì mannual?
Sasha

2
Tại sao bạn cần một con trăn để làm điều đó, bạn có thể tự làm điều đó? trên một ghi chú nghiêm túc hơn, tại sao bạn cần nó, mục đích là gì, một chút chi tiết sẽ rất tuyệt
Anurag Uniyal

2
Chỉ cần FYI nếu bạn đang sử dụng điều này để giữ cho máy của bạn không bị khóa, bạn có thể vi phạm chính sách bảo mật của công ty hoặc tổ chức vì đây là một biện pháp phá vỡ các thuộc tính khóa máy tính tự động. Ive đã sử dụng điều này ở một số nơi, không có vấn đề gì, luôn luôn đảm bảo kiểm tra với Quản trị viên Sys của bạn. Tôi đã thấy mọi người mất việc vì những thứ nhỏ nhặt như thế này.
AlienAnarchist

Câu trả lời:


329

Đã thử nghiệm trên WinXP, Python 2.6 (3.x cũng đã thử nghiệm) sau khi cài đặt pywin32 (pywin32-214.win32-py2.6.exe trong trường hợp của tôi):

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))tốt hơn là được thay thế bằng win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))kinh nghiệm của tôi để tích hợp tốt hơn với các ứng dụng khác như trò chơi.
Falcon

1
@ ObsessiveSSOℲ chỉ cần tháo cờ MOUSEEVENTF_ABSOLUTE. để biết chi tiết: msdn.microsoft.com/en-us/l Library / windows / desktop / 2007
Falcon

Tôi có thể sử dụng thư viện này để kiểm soát tốc độ / gia tốc của chuột không?
Ai đó Ai đó

Điều này có lợi thế là không yêu cầu cài đặt (và xem xét và phê duyệt quản lý liên quan) của các mô-đun Python không chuẩn trên 50 hộp cửa sổ (các kiosk bảng hiệu kỹ thuật số).
brichin

4
cũng đã thử nghiệm trong python3.xcác tác phẩm, vui lòng chỉnh sửa câu trả lời
WhatsThePoint

132

Hãy thử với mô-đun PyAutoGUI . Đó là đa nền tảng.

pip install pyautogui

Và vì thế:

import pyautogui
pyautogui.click(100, 100)

Nó cũng có các tính năng khác:

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

Điều này dễ dàng hơn nhiều so với việc đi qua tất cả các công cụ win32con.


14
Tuyệt quá! Đó là đa nền tảng!
les

Pyautogui là một mô-đun tuyệt vời, nhưng tiếc là rất chậm. Trong Ubuntu, nó di chuyển con trỏ 2-3 lần mỗi giây. Đáng kinh ngạc! Pyuserinput nhanh hơn 1000 lần.
Vladyslav Savigan

1
Đối với những người đang cố gắng cài đặt pyautogui, hãy xem tại đây stackoverflow.com/questions/5892297/NH và đảm bảo đặt sudo trước các lệnh của bạn nếu bạn gặp vấn đề về quyền.
retodaredevil

5
"PyAutoGUI chậm" vì tính năng an toàn có thêm tạm dừng 0,1 giây sau mỗi cuộc gọi. Nếu tập lệnh của bạn nằm ngoài tầm kiểm soát, bạn có thể đập con chuột vào góc trên bên trái trong 0,1 giây đó để dừng nó. Để tắt tính năng này, hãy chạy pyautogui.PAUSE = 0 (mặc dù điều này không được khuyến nghị, vì bạn không thể sử dụng chuột / bàn phím để dừng tập lệnh.)
Al Sweigart

76

Bạn có thể sử dụng win32apihoặc ctypesmô-đun để sử dụng win32 apis để điều khiển chuột hoặc bất kỳ gui nào

Dưới đây là một ví dụ thú vị để điều khiển chuột bằng 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)

Một nhấp chuột bằng cách sử dụng 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

11
mã ctypes của bạn làm việc cho tôi mà không cần bất kỳ thư viện bổ sung nào! (python 2.6 trên windows 7)
intrepion

1
Không sử dụng bất kỳ thư viện bên ngoài! Cảm ơn bạn
Akshat Agarwal

2
Cảm ơn bạn! Tôi không thể chịu được rằng có 3 thư viện bên thứ 3 mà bạn có thể làm điều này, tuy nhiên cả 3 thư viện đang điên cuồng cài đặt hoặc khắc phục sự cố. Giải pháp ctypes này là giải pháp python bản địa đầu tiên và nó hoạt động tốt hơn mọi giải pháp khác mà tôi đã gặp.
DuckPuncher

Tài liệu ở SetCursorPosđâu?
ArtOfWarfare

22

Một tùy chọn khác là sử dụng gói AutoPy đa nền tảng . Gói này có hai tùy chọn khác nhau để di chuyển chuột:

Đoạn mã này sẽ ngay lập tức di chuyển con trỏ đến vị trí (200.200):

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

Thay vào đó, nếu bạn muốn con trỏ di chuyển rõ ràng trên màn hình đến một vị trí nhất định, bạn có thể sử dụng lệnh smooth_move:

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

21

Kiểm tra PyMouse đa nền tảng: https://github.com/pepijndevos/PyMouse/


8
PyMouse đã được thay thế bằng PyUserInput , phù hợp chính xác với yêu cầu, sử dụng đơn giản và đa nền tảng. Lớn +1
dùng336851

@ user336851, bạn có biết cách tap spacetap screen shot keybằng cách sử dụng PyUswerInput không?
dùng3768495

@ user336851, Lúc này PyUserInputbị hỏng. Không thể nói nó có hoạt động tốt hay không bởi vì tôi thậm chí không thể cài đặt nó do phụ thuộc bị hỏng.
DuckPuncher

20

Linux

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

Nguồn: Chuột Python di chuyển trong 5 dòng mã (chỉ dành cho Linux) .


20
Một google cho "Python điều khiển chuột di chuyển" bây giờ tìm thấy trang này, cách meta.
Copas

2
Để hoàn thiện, vì câu hỏi cũng được yêu cầu mô phỏng các lần nhấp chuột, tôi sẽ thêm: 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();cuộc gọi ngủ () giữa báo chí và phát hành có thể hoặc không thể được yêu cầu tùy thuộc vào ứng dụng đích.
dùng336851

4
@Copas - Kết quả xuất hiện trong Google của bạn có nghĩa là gì. Bạn đang ở trong một bong bóng. Điều này xuất hiện trong một tìm kiếm DuckDuckGo cho cùng một thuật ngữ - đó là một điều có thật. Đó là điều mà mọi người khác có thể tái tạo và tự mình nhìn thấy. Đó là meta.
ArtOfWarfare

1
Để điều khiển chuột trong phiên VNC, bạn cần số hiển thị cũng như "d = display.Display (': 1')" trong đó: 1 là số hiển thị.
Zafer

12

Pynput là giải pháp tốt nhất tôi đã tìm thấy, cho cả Windows và Mac. Siêu dễ dàng để lập trình, và hoạt động rất tốt.

Ví dụ,

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)

Tôi vừa thử chạy một chương trình cũ trên máy tính Windows và nó không hoạt động, vì vậy vui lòng kiểm tra trước khi sử dụng. Chương trình này ít nhất tuyên bố hỗ trợ cả hai.
Pro Q

Tôi đã thực hiện một số thử nghiệm và hóa ra vấn đề của tôi là trên Mac, có các giá trị tọa độ hoạt động tốt, nhưng trên Windows, tọa độ cần phải là số nguyên. Mô-đun này là đa nền tảng.
Pro Q

Tôi đã thêm một Vấn đề vào kho github để xem họ có thể cải thiện nó không: github.com/moses-palmer/pynput/issues/79
Pro Q

Có vẻ như vấn đề đã được khắc phục.
Pro Q

8

Chức năng nhanh và bẩn sẽ nhấp chuột trái bất cứ lúc clicksnào trên Windows 7 bằng ctypesthư viện. Không cần tải xuống.

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

Kể từ năm 2020 , bạn có thể sử dụng chuột :

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

Đặc trưng

  • Móc sự kiện toàn cầu trên tất cả các thiết bị chuột (chụp các sự kiện bất kể trọng tâm).
  • Nghe và gửi các sự kiện chuột.
  • Hoạt động với Windows và Linux (yêu cầu sudo).
  • Python thuần túy, không có mô-đun C nào được biên dịch.
  • Không phụ thuộc. Không quan trọng để cài đặt và triển khai, chỉ cần sao chép các tập tin.
  • Con trăn 2 và 3
  • Bao gồm API cấp cao (ví dụ: ghi và phát.
  • Sự kiện tự động được chụp trong luồng riêng biệt, không chặn chương trình chính.
  • Đã thử nghiệm và ghi lại.

2

Nếu bạn muốn di chuyển chuột, hãy sử dụng:

import pyautogui
pyautogui.moveTo(x,y)

Nếu bạn muốn nhấp, sử dụng cái này:

import pyautogui
pyautogui.click(x,y)

Nếu bạn chưa pyautoguicài đặt, bạn phải gắn python vào CMD. Chuyển đến CMD và viết:pip install pyautogui

Điều này sẽ cài đặt pyautoguicho Python 2.x.

Đối với Python 3.x, bạn có thể sẽ phải sử dụng pip3 install pyautoguihoặc python3 -m pip install pyautogui.


Bạn sẽ muốn gọi pyautogui.moveTo(x, y)move()di chuyển con trỏ so với vị trí hiện tại của nó.
Al Sweigart

Ah, xin lỗi tôi đã hiểu nhầm ý kiến ​​ban đầu của bạn. Vâng, cả hai chức năng làm việc. moveTo()di chuyển đến một vị trí tuyệt đối, trong khi move()di chuyển so với vị trí con trỏ hiện tại.
Al Sweigart

1

Một lựa chọn khác là thư viện chuột , cá nhân tôi sử dụng nó vì nó tương đối đơn giản và đa nền tảng.

Đây là cách bạn có thể sử dụng nó:

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

Đây là nguồn: Cách kiểm soát chuột của bạn trong Python


1

Câu trả lời được chấp nhận có hiệu quả đối với tôi nhưng nó không ổn định (đôi khi số lần nhấp sẽ không hiển thị) vì vậy tôi đã thêm MOUSEEVENTF_LEFTUP . Sau đó, nó đã làm việc đáng tin cậy

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

rất dễ dàng cài đặt pakage:

pip install mouse

2- thêm thư viện vào dự án:

import mouse

3- sử dụng nó chẳng hạn:

mouse.right_click()

trong url này mô tả tất cả các chức năng mà bạn có thể sử dụng nó:

https://github.com/boppreh/mouse

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.