使用Python實(shí)現(xiàn)操作控制鼠標(biāo)和鍵盤
楔子
Python 有很多的庫可以實(shí)現(xiàn)各種各樣的功能,比如使用 pynput 操作你的鼠標(biāo)和鍵盤。如果你寫過游戲,那么用 pygame 和 pyglet 也可以,只不過它們畢竟是開發(fā)游戲的,要只是為了操作鼠標(biāo)和鍵盤,用它們就有點(diǎn)小題大做了。
下面來看看 pynput 這個庫的用法。
操作鼠標(biāo)
鼠標(biāo)的操作無非就是點(diǎn)擊按住不放、松開、雙擊,滑動滾輪,移動鼠標(biāo)等等。
from pynput.mouse import Button, Controller # 實(shí)例化 Controller 得到一個可以操作鼠標(biāo)的對象 mouse = Controller() # mouse.position: 獲取當(dāng)前鼠標(biāo)位置。 # 屏幕左上角坐標(biāo)為 (0, 0),右下角為 (屏幕寬度, 屏幕高度) print(f"當(dāng)前鼠標(biāo)位置: {mouse.position}") """ 當(dāng)前鼠標(biāo)位置: (881, 467) """ # 給 mouse.position 賦值等于移動鼠標(biāo),這里相當(dāng)于移動到 (100, 100) 的位置 # 如果坐標(biāo)小于 0,那么等于 0。如果超出屏幕范圍,那么等于最大范圍 mouse.position = (100, 100) # 此方法等價于 mouse.move(100, 100) print(f"當(dāng)前鼠標(biāo)位置: {mouse.position}") """ 當(dāng)前鼠標(biāo)位置: (100, 100) """ # 按下左鍵, 同理 Button.right 是右鍵 mouse.press(Button.left) # 松開左鍵 mouse.release(Button.left) # 上面兩行連在一起等于一次單擊 # 如果這兩行緊接著再重復(fù)一次,那么整體會實(shí)現(xiàn)雙擊的效果 # 因為兩次單擊是連續(xù)執(zhí)行的,沒有等待時間。 # 如果中間來一個 time.sleep,那么就變成兩次單擊了 # 當(dāng)然鼠標(biāo)點(diǎn)擊我們有更合適的辦法,使用 click 函數(shù) # 該函數(shù)接收兩個參數(shù):點(diǎn)擊鼠標(biāo)的哪個鍵、以及點(diǎn)擊次數(shù) # 這里連續(xù)點(diǎn)擊兩次,等于雙擊 mouse.click(Button.right, 2)
然后是滑動滾輪,這個需要找張圖片來演示。
這種情況我們?nèi)绻胫栏鄡?nèi)容,需要向下滑動,也就是沿著 y 軸滑動。
from pynput.mouse import Controller mouse = Controller() # 垂直方向、沿著 y 軸向下滑動 2 個 step # 第一個參數(shù)針對水平方向,第二個參數(shù)針對垂直方向 # 具體的值表示移動的 step 數(shù) mouse.scroll(0, 2)
那么問題來了,什么是 step 呢?
點(diǎn)擊一次就會移動一個 step。
同理這個就是在水平方向上移動。
from pynput.mouse import Controller mouse = Controller() # 水平方向:大于 0 向右,小于 0 向左 # 垂直方向:大于 0 向下,小于 0 向上 mouse.scroll(3, 0)
可能有人好奇,可不可以水平、垂直兩個方向同時移動呢?答案是不可以,因為是模擬人來點(diǎn)擊,無非就是效率的問題,所以也要符合常理,而我們平時用鼠標(biāo)顯然不可能兩個方向同時移動。
監(jiān)控鼠標(biāo)
除了操作鼠標(biāo)之外,pynput 也支持監(jiān)控,記錄我們做了哪些操作。
from pynput.mouse import Listener, Button def on_move(x, y): print(f"鼠標(biāo)移動到: ({x}, {y})") def on_click(x, y, button, is_press): if button == Button.left: button = "左鍵" else: button = "右鍵" if is_press: operator = "按下" else: operator = "松開" print(f"鼠標(biāo){button}在 ({x}, {y}) 處{operator}") def on_scroll(x, y, dx, dy): if dx: print(f"滑輪在 ({x}, {y}) 處向{'右' if dx > 0 else '左'}滑") else: print(f"滑輪在 ({x}, {y}) 處向{'下' if dy > 0 else '上'}滑") with Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll ) as listener: listener.join() """ 鼠標(biāo)移動到: (783.17578125, 302.7890625) 鼠標(biāo)移動到: (777.2734375, 302.7890625) 鼠標(biāo)移動到: (769.5703125, 302.7890625) 鼠標(biāo)移動到: (758.74609375, 302.7890625) 滑輪在 (111.03515625, 609.31640625) 處向上滑 滑輪在 (111.03515625, 609.31640625) 處向上滑 滑輪在 (111.03515625, 609.31640625) 處向上滑 滑輪在 (111.03515625, 609.31640625) 處向左滑 滑輪在 (111.03515625, 609.31640625) 處向左滑 鼠標(biāo)左鍵在 (649.44140625, 448.4765625) 處按下 鼠標(biāo)左鍵在 (649.44140625, 448.4765625) 處松開 """
上面實(shí)例化 Listener 時,相當(dāng)于開啟了一個線程,因為 Listener 這個類繼承自 Thread。所以我們調(diào)用 listener.join() 就相當(dāng)于阻塞在這里了,會一直監(jiān)控鼠標(biāo)事件。
如果回調(diào)函數(shù)里面返回了 False,那么監(jiān)聽會自動停止。
from pynput.mouse import Listener, Button def on_click(x, y, button, is_press): if button == Button.right: print("點(diǎn)擊鼠標(biāo)右鍵,監(jiān)聽結(jié)束") return False if is_press: operator = "按下" else: operator = "松開" print(f"鼠標(biāo)左鍵在 ({x}, {y}) 處{operator}") with Listener( on_click=on_click, ) as listener: listener.join() """ 鼠標(biāo)左鍵在 (28.453125, 610.71484375) 處按下 鼠標(biāo)左鍵在 (28.453125, 610.71484375) 處松開 點(diǎn)擊鼠標(biāo)右鍵,監(jiān)聽結(jié)束 """
當(dāng)然啦,程序在創(chuàng)建 Listener 的時候,使用的是 with 語句,會一直阻塞在這里。如果不希望它阻塞,還可以這么做。
listener = Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll) # 啟動子線程開啟監(jiān)聽,主線程會繼續(xù)向下執(zhí)行 listener.start() # 如果不想監(jiān)聽了,可以調(diào)用 stop 方法結(jié)束 listener.stop()
操作鍵盤
操作鍵盤也比較簡單,無非也是按下某個鍵、松開某個鍵,在按下某個鍵(或者多個)不松開的前提下按下另一個鍵。
下面來操作一下,方法和操作鼠標(biāo)比較類似。
from pynput.keyboard import Key, Controller # 實(shí)例化一個可以操作鍵盤的對象 keyboard = Controller() # 按下 a 鍵,小寫 keyboard.press("a") # 松開 a 鍵 keyboard.release("a") # 按下 A 鍵,大寫 keyboard.press("A") # 松開 A 鍵 keyboard.release("A") """ 像英文字符、數(shù)字等等直接輸入相應(yīng)的字符即可 但如果是 shift、ctrl 等鍵,那么需要調(diào)用 Key 里面屬性 """ # 按下大寫鍵 keyboard.press(Key.caps_lock) # 松開大寫鍵 keyboard.release(Key.caps_lock)
然后是按住某個鍵不放的前提下,按下另外的鍵。
from pynput.keyboard import Key, Controller keyboard = Controller() # shift 有兩個鍵,一個是左邊的、一個是右邊的,此時相當(dāng)于輸入感嘆號 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)
監(jiān)控鍵盤
監(jiān)控鍵盤使用的方法和監(jiān)控鼠標(biāo)非常類似,依舊是實(shí)例化一個類Listener。
from pynput.keyboard import Key, Listener def on_press(key): # 當(dāng)按下esc,結(jié)束監(jiān)聽 if key == Key.esc: print(f"你按下了 esc,監(jiān)聽結(jié)束") return False print(f"你按下了 {key} 鍵") def on_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,監(jiān)聽結(jié)束 """
以上就是這個模塊的基本內(nèi)容,具體怎么使用由你自己決定。另外這個模塊在 Linux 上也是可以運(yùn)行的,但前提是必須有顯示器。
到此這篇關(guān)于使用Python實(shí)現(xiàn)操作控制鼠標(biāo)和鍵盤的文章就介紹到這了,更多相關(guān)Python操作鼠標(biāo)和鍵盤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python實(shí)現(xiàn)鍵盤控制鼠標(biāo)移動
- Python控制鍵盤鼠標(biāo)pynput的詳細(xì)用法
- 使用 python pyautogui實(shí)現(xiàn)鼠標(biāo)鍵盤控制功能
- python模擬鼠標(biāo)點(diǎn)擊和鍵盤輸入的操作
- python 實(shí)現(xiàn)控制鼠標(biāo)鍵盤
- Python控制鼠標(biāo)鍵盤代碼實(shí)例
- 詳解Python中鍵盤鼠標(biāo)的相關(guān)操作
- python實(shí)現(xiàn)模擬鍵盤鼠標(biāo)重復(fù)性操作Pyautogui
- python?PyAutoGUI實(shí)現(xiàn)自動化鼠標(biāo)鍵盤等常用操作
相關(guān)文章
Python圖片轉(zhuǎn)換成矩陣,矩陣數(shù)據(jù)轉(zhuǎn)換成圖片的實(shí)例
今天小編就為大家分享一篇Python圖片轉(zhuǎn)換成矩陣,矩陣數(shù)據(jù)轉(zhuǎn)換成圖片的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07python 處理telnet返回的More,以及get想要的那個參數(shù)方法
今天小編就為大家分享一篇python 處理telnet返回的More,以及get想要的那個參數(shù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python的Flask框架中@app.route的用法教程
這篇文章主要介紹了Python的Flask框架中@app.route的用法教程,包括相關(guān)的正則表達(dá)式講解,是Flask學(xué)習(xí)過程當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下2015-03-03Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶端通信
這篇文章主要介紹了Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶端通信的相關(guān)資料,這里對Scoket 進(jìn)行詳解并創(chuàng)建TCP服務(wù)器及TCP 客戶端實(shí)例代碼,需要的朋友可以參考下2017-01-01Python實(shí)現(xiàn)爬蟲IP負(fù)載均衡和高可用集群的示例代碼
做大型爬蟲項目經(jīng)常遇到請求頻率過高的問題,這里需要說的是使用爬蟲IP可以提高抓取效率,本文主要介紹了Python實(shí)現(xiàn)爬蟲IP負(fù)載均衡和高可用集群的示例代碼,感興趣的可以了解一下2023-12-12python中resample函數(shù)實(shí)現(xiàn)重采樣和降采樣代碼
今天小編就為大家分享一篇python中resample函數(shù)實(shí)現(xiàn)重采樣和降采樣代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02