當前位置: 妍妍網 > 辦公

用Python操作你的滑鼠和鍵盤

2024-05-06辦公

有很多小夥伴在用 P ython 做自動化開發時有遇到過控制 滑鼠和鍵盤 的需求。這個功能在 Python 中有好幾個第三方模組可以實作。

今天我們就來看看如何用 pynput 這個庫實作對滑鼠和鍵盤的控制。

操作滑鼠

滑鼠的操作無非就是 點選按住不放 松開 雙擊 滑動滾輪 移動滑鼠 等等。

from pynput.mouse import Button, Controller
# 例項化 Controller 得到一個可以操作滑鼠的物件
mouse = Controller()
# mouse.position: 獲取當前滑鼠位置。
# 螢幕左上角座標為 (0, 0),右下角為 (螢幕寬度, 螢幕高度)
print(f"當前滑鼠位置: {mouse.position}")
"""
當前滑鼠位置: (881, 467)
"""

# 給 mouse.position 賦值等於移動滑鼠,這裏相當於移動到 (100, 100) 的位置
# 如果座標小於 0,那麽等於 0。如果超出螢幕範圍,那麽等於最大範圍
mouse.position = (100100) # 此方法等價於 mouse.move(100, 100)
print(f"當前滑鼠位置: {mouse.position}")
"""
當前滑鼠位置: (100, 100)
"""


# 按下左鍵, 同理 Button.right 是右鍵
mouse.press(Button.left)
# 松開左鍵
mouse.release(Button.left)
# 上面兩行連在一起等於一次單擊
# 如果這兩行緊接著再重復一次,那麽整體會實作雙擊的效果
# 因為兩次單擊是連續執行的,沒有等待時間。
# 如果中間來一個 time.sleep,那麽就變成兩次單擊了

# 當然滑鼠點選我們有更合適的辦法,使用 click 函式
# 該函式接收兩個參數:點選滑鼠的哪個鍵、以及點選次數
# 這裏連續點選兩次,等於雙擊
mouse.click(Button.right, 2)



然後是滑動滾輪,這個需要找張圖片來演示。

這種 情況我們 如果想知道更多內容,需要向下滑動,也就是沿著 y 軸滑動。

from pynput.mouse import Controller
mouse = Controller()
# 垂直方向、沿著 y 軸向下滑動 2 個 step
# 第一個參數針對水平方向,第二個參數針對垂直方向
# 具體的值表示移動的 step 數
mouse.scroll(02)

那麽問題來了,什麽是 step 呢?

點選一次就會移動一個 step。

同理這個就是在水平方向上移動。

from pynput.mouse import Controller
mouse = Controller()
# 水平方向:大於 0 向右,小於 0 向左
# 垂直方向:大於 0 向下,小於 0 向上
mouse.scroll(30)

可能有人好奇,可不可以水平、垂直兩個方向同時移動呢? 答案是不可以,因為是模擬人來點選,無非就是效率的問題,所以也要符合常理,而我們平時用滑鼠顯然不可能兩個方向同時移動。

監控滑鼠

除了操作滑鼠之外,pynput 也支持監控,記錄我們做了哪些操作。

from pynput.mouse import Listener, Button
defon_move(x, y):
print(f"滑鼠移動到: ({x}{y})")
defon_click(x, y, button, is_press):
if button == Button.left:
button = "左鍵"
else:
button = "右鍵"
if is_press:
operator = "按下"
else:
operator = "松開"
print(f"滑鼠{button}在 ({x}{y}) 處{operator}")
defon_scroll(x, y, dx, dy):
if dx:
print(f"滑輪在 ({x}{y}) 處向{'右'if dx > 0else'左'}滑")
else:
print(f"滑輪在 ({x}{y}) 處向{'下'if dy > 0else'上'}滑")
with Listener(
on_move=on_move,
on_click=on_click,
on_scroll=on_scroll
as listener:
listener.join()
"""
滑鼠移動到: (783.17578125, 302.7890625)
滑鼠移動到: (777.2734375, 302.7890625)
滑鼠移動到: (769.5703125, 302.7890625)
滑鼠移動到: (758.74609375, 302.7890625)
滑輪在 (111.03515625, 609.31640625) 處向上滑
滑輪在 (111.03515625, 609.31640625) 處向上滑
滑輪在 (111.03515625, 609.31640625) 處向上滑
滑輪在 (111.03515625, 609.31640625) 處向左滑
滑輪在 (111.03515625, 609.31640625) 處向左滑
滑鼠左鍵在 (649.44140625, 448.4765625) 處按下
滑鼠左鍵在 (649.44140625, 448.4765625) 處松開
"""





上面例項化 Listener 時,相當於開啟了一個執行緒,因為 Listener 這個類繼承自 Thread。 所以我們呼叫 listener.join() 就相當於阻塞在這裏了,會一直監控滑鼠事件。

如果回呼函式裏面返回了 False,那麽監聽會自動停止。

from pynput.mouse import Listener, Button
defon_click(x, y, button, is_press):
if button == Button.right:
print("點選滑鼠右鍵,監聽結束")
returnFalse
if is_press:
operator = "按下"
else:
operator = "松開"
print(f"滑鼠左鍵在 ({x}{y}) 處{operator}")

with Listener(
on_click=on_click,
as listener:
listener.join()
"""
滑鼠左鍵在 (28.453125, 610.71484375) 處按下
滑鼠左鍵在 (28.453125, 610.71484375) 處松開
點選滑鼠右鍵,監聽結束
"""



當然啦,程式在建立 Listener 的時候,使用的是 with 語句,會一直阻塞在這裏。如果不希望它阻塞,還可以這麽做。

listener = Listener(
on_move=on_move,
on_click=on_click,
on_scroll=on_scroll)
# 啟動子執行緒開啟監聽,主執行緒會繼續向下執行
listener.start()
# 如果不想監聽了,可以呼叫 stop 方法結束
listener.stop()


操作鍵盤

操作鍵盤也比較簡單,無非也是按下某個鍵、松開某個鍵,在按下某個鍵( 或者多個) 不松開的前提下按下另一個鍵。

下面來操作一下, 方法和操作滑鼠比較類似。

from pynput.keyboard import Key, Controller
# 例項化一個可以操作鍵盤的物件
keyboard = Controller()
# 按下 a 鍵,小寫
keyboard.press("a")
# 松開 a 鍵
keyboard.release("a")
# 按下 A 鍵,大寫
keyboard.press("A")
# 松開 A 鍵
keyboard.release("A")
"""
像英文字元、數位等等直接輸入相應的字元即可
但如果是 shift、ctrl 等鍵,那麽需要呼叫 Key 裏面內容
"""

# 按下大寫鍵
keyboard.press(Key.caps_lock)
# 松開大寫鍵
keyboard.release(Key.caps_lock)


然後是按住某個鍵不放的前提下,按下另外的鍵。

from pynput.keyboard import Key, Controller
keyboard = Controller()
# shift 有兩個鍵,一個是左邊的、一個是右邊的,此時相當於輸入感嘆號
with keyboard.pressed(Key.shift_l):
keyboard.press("1")
keyboard.release("1")
# 如果要同時按下多個鍵,那就輸入多個鍵即可
with keyboard.pressed(Key.shift_l, Key.ctrl_l):
keyboard.press(Key.f10)


監控鍵盤

監控鍵盤使用的方法和監控滑鼠非常類似,依舊是例項化一個類Listener。

from pynput.keyboard import Key, Listener
defon_press(key):
# 當按下esc,結束監聽
if key == Key.esc:
print(f"你按下了 esc,監聽結束")
returnFalse
print(f"你按下了 {key} 鍵")
defon_release(key):
print(f"你松開了 {key} 鍵")

with Listener(
on_press=on_press, 
on_release=on_release
as listener:
listener.join()
"""
你按下了 'a' 鍵
你松開了 'a' 鍵
你按下了 Key.backspace 鍵
你松開了 Key.backspace 鍵
你按下了 Key.shift 鍵
你松開了 Key.shift 鍵
你按下了 'c' 鍵
你松開了 'c' 鍵
你按下了 Key.enter 鍵
你松開了 Key.enter 鍵
你按下了 esc,監聽結束
"""



以上就是這個模組的基本內容,具體怎麽使用由你自己決定。 另外這個模組在 Linux 上也是可以執行的,但前提是必須有顯視器。

Crossin的新書【 碼上行動:用ChatGPT學會Python編程 】已經上市了。 本書以ChatGPT為輔助,系統全面地講解了如何掌握Python編程,適合Python零基礎入門的讀者學習。

購買後可加入讀者交流群,Crossin為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。

Crossin的其他書籍:

添加微信 crossin123 ,加入編程教室共同學習 ~

感謝 轉發 點贊 的各位~