天天看點

python pywinauto 單擊滑鼠_Python釋放你的雙手去成就夢想之自動化控制滑鼠鍵盤

抖音上經常看到,魔獸玩家為了不掉線讓女友一直幫忙按空格鍵,而我這條單身狗出去吃個飯就要繼續排隊幾小時,無奈隻能自力更生,下面讓我向大家介紹下如何自動化控制滑鼠鍵盤,讓我們從重複無聊的工作中解放出來。

一、 安裝pyautogui子產品

第一步先要安裝pyautogui子產品,如果有不會安裝的可以檢視我之前的文章:

《如何友善的安裝各類python庫》

Python能以你想象不到的速度移動滑鼠和敲擊鍵盤,實際上它有可能太快,導緻其他程式跟不上(python:怪我喽),如果你寫的程式失去控制最簡單的方式是登出,ctrl+alt+del,通過登出,你會失去所有未儲存的工作,但至少不需要等計算機完全重新開機。

更好的做法是設定pyautogui.Pause變量,讓pyautogui函數調用在執行結束之後停頓一下。

Pyautogui也有自動防故障功能,将pyautogui.FAILSAFE設定為True的情況下盡可能快速的向左上移動滑鼠,自動防故障功能會停止程式工作。

#設定pyautogui函數調用成功後停止0.5spyautogui.PAUSE = 0.5# 開啟Pyautogui自動防故障功能 pyautogui.FAILSAFE = True
           

二、 控制滑鼠

1. 擷取螢幕大小

Pyautogui的滑鼠函數使用x、y坐标,螢幕的左上角x、y都是零,向右x坐标增加,向下y坐标增加。

分辨率是指螢幕的寬和高有多少像素,如果螢幕的分辨率設定為1920*1080,那麼左上角的坐标是(0, 0),右下角的坐标是(1919, 1079)

pyautogui.size()可以傳回螢幕的寬和高

# 擷取螢幕大小print(pyautogui.size())
           

2. 移動滑鼠

Pyautogui.moveTo()函數可以将滑鼠移動到指定地點,其中第一和第二個參數分别代表x、y的坐标的整數值(小數部分會被忽略),可選的duration關鍵字可設定将滑鼠移動到指定位置所需要的秒數(可以為整數或浮點數),如果不指定預設為0,表示立即移動。

# 使用Pyautogui.moveTo()循環畫正方形for i in range(5): pyautogui.moveTo(200, 200, duration=0.25) pyautogui.moveTo(400, 200, duration=0.25) pyautogui.moveTo(400, 400, duration=0.25) pyautogui.moveTo(200, 400, duration=0.25)
           

pyautogui.moveRel()函數相對于目前位置移動滑鼠,也接受三個參數,第一個參數如果為正表示向右移動的像素數,第二個參數如果為正表示向下移動的像素數,如果為負則表示相反的方向,第三個參數duration和Pyautogui.moveTo()的一樣。

# 使用pyautogui.moveRel循環畫正方形for i in range(5): pyautogui.moveRel(200, 0, duration=0.25)pyautogui.moveRel(0, 200, duration=0.25)pyautogui.moveRel(-200, 0, duration=0.25)pyautogui.moveRel(0, -200, duration=0.25)
           

3. 擷取滑鼠位置

pyautogui.position()函數可以确定滑鼠目前的位置。

下面是循環擷取滑鼠位置的代碼,後面章節擷取元素位置的時候需要用到它。

# 擷取滑鼠位置while True: print(pyautogui.position()) time.sleep(1)
           

4. 點選滑鼠

pyautogui.click()函數,預設點選使用滑鼠左鍵,點選滑鼠目前位置,如果想點選其他位置,可傳入x、y坐标作為可選的第一第二參數,如果想指定滑鼠按鍵,需加入button關鍵字參數,示例如下:

# 在滑鼠目前位置單擊滑鼠左鍵pyautogui.click()# 指定位置單擊滑鼠左鍵pyautogui.click(50, 500)# 指定位置單擊滑鼠右鍵pyautogui.click(50, 500, button='right')# 指定位置單擊滑鼠中鍵pyautogui.click(50, 500, button='middle')
           

輕按兩下滑鼠操作,可傳入x,y坐标在指定位置輕按兩下,示例如下:

# 輕按兩下滑鼠左鍵pyautogui.doubleClick(50, 500)# 輕按兩下滑鼠右鍵pyautogui.rightClick()# 輕按兩下滑鼠中鍵pyautogui.middleClick()
           

5. 拖動滑鼠

“拖動”意味着移動滑鼠,同時按住一個鍵不放。

Pyautogui提供了pyautogui.dragTo()和pyautogui.dragRel()函數,分别實作将滑鼠拖動到一個新的位置,或相對于目前的位置。

dragTo()和dragRel()函數的參數與moveTo()和moveRel相同,在此不再贅述。

下面是一個自動畫圖的示例:

# 啟動畫圖軟體,啟用下面程式,5秒内将滑鼠放置在畫圖軟體上,開始自動畫圖time.sleep(5)pyautogui.click()distance = 200while distance > 0: pyautogui.dragRel(distance, 0, duration=0.5) # move right distance -= 5 pyautogui.dragRel(0, distance, duration=0.5) # move down pyautogui.dragRel(-distance, 0, duration=0.5) # move left distance -= 5 pyautogui.dragRel(0, -distance, duration=0.5) # move up
           

效果如下:

python pywinauto 單擊滑鼠_Python釋放你的雙手去成就夢想之自動化控制滑鼠鍵盤

自動畫圖效果

6. 滾動滑鼠

Pyautogui.srcoll()可滾動滑鼠中鍵,輸入一個整形參數,如果為正向上滾動,反之向下,具體需要滾動多少需根據情況自行選擇。

三、 處理螢幕

如果你想實作和計算機的自動互動,你還需要确認目前的螢幕内容和你的預期是否一緻,比如你下一步的目标是點選微信圖示,但螢幕上沒有微信圖示,那可能視窗出現了意外,程式需要作出對應的回報。

1. 擷取并分析螢幕快照

pyautogui.screenshot()可以擷取一個螢幕快照的Image對象,Image對象的getpixel()函數,輸入x、y坐标可以擷取位置的像素顔色。

快照示例:

# 擷取目前螢幕im = pyautogui.screenshot()# 擷取該位置像素點顔色print(im.getpixel((385, 137)))
           

pyautogui.pixelMatchesColor()函數可以确認指定坐标顔色是否和指定顔色比對,比對傳回True,否則傳回False。

print(pyautogui.pixelMatchesColor(385, 137, (247, 245, 254)))
           

确認目前是否處于桌面示例:

# 按win+d回到桌面,後面章節會講到pyautogui.hotkey('winleft', 'd')# 擷取螢幕快照im = pyautogui.screenshot()# 擷取a點顔色,可以多擷取幾個點colour_a = im.getpixel((385, 137))# 5秒之後檢視,是否還處于桌面下time.sleep(5)if not pyautogui.pixelMatchesColor(385, 137, colour_a): print('something wrong')else: print('everything is ok')
           

2. 圖像識别

如果你想點選微信圖示,但不知道點選哪裡怎麼辦,可以向PyAutoGUI提供微信的圖像,讓後讓它去尋找坐标。

LocateOnScreen()函數接受一張圖檔,傳回4個整數元組,是螢幕上首次發現該圖檔時左邊的x坐标、頂邊的y坐标、寬度以及高度。

使用LocateOnScreen()擷取圖檔的位置元組後,将元組傳遞給center()函數,它将傳回該區域中心的x、y坐标。

下面以識别微信圖示并點選來做個示例:

先使用第二章介紹的不斷擷取滑鼠位置的程式,擷取螢幕上微信圖示的位置(擷取左上角坐标和右下角坐标,使用Image.Crop()方法截取圖示。

Crop方法接受一個矩形元組,傳回一個Image對象,矩形元組值得意義分别為,左:矩形最左邊x坐标,頂:矩形頂邊y坐标,右:矩形最右邊x坐标,底:矩形底部y坐标。

# 回到桌面pyautogui.hotkey('winleft', 'd')# 擷取螢幕截圖im = pyautogui.screenshot()# 截取并儲存微信圖示croppedIm = im.crop((15, 454, 91, 523))croppedIm.save('wechat.png') # 在螢幕上尋找微信圖示的位置,并将滑鼠移至圖示中心,然後輕按兩下pyautogui.moveTo(pyautogui.center(pyautogui.locateOnScreen('wechat.png ')))pyautogui.doubleClick()
           

四、 控制鍵盤

Pyautogui可以向計算機發送虛拟按鍵,類似魔獸世界裡幫忙按空格這種小事當然小菜一碟,雖然這麼友善,我怎麼還是想找個女友幫我按呢。

1. 通過鍵盤發送一個字元串

Pyautogui.typewrite()函數像計算機發送虛拟按鍵,這些按鍵産生什麼效果,取決于目前獲得焦點的視窗和文本輸入框,如果焦點在魔獸世界裡,此時按空格,那角色就會跳起來,如果焦點處于word裡那就是輸入空格。

示例如下:

# 點選wordpyautogui.Click(100, 100)# 向word輸入hello worldpyautogui.typewrite("hello world")
           

Pyautogui支援如下鍵名,幾乎涵蓋了所有字元,除了博大精深的中文字元,這個後面再說

python pywinauto 單擊滑鼠_Python釋放你的雙手去成就夢想之自動化控制滑鼠鍵盤

支援的按鍵

2. 熱鍵組合

熱鍵或快捷鍵是一種按鍵組合,它調用某種應用功能,比如拷貝選擇内容的常用熱鍵是ctrl + c,這種按鍵組合需要按住ctrl鍵然後按着c鍵,還好有pyautogui.hotkey()函數,它接受多個鍵字元串參數,按順序按下,再按相反的順序釋放,對于ctrl+c,代碼如下:

pyautogui.hotkey('ctrl', 'c')
           

關于中文輸入的問題,需要使用pyperclip.copy函數(需要安裝pyperclip庫),此函數可以将輸入的參數放入剪切闆,然後按ctrl +v進行粘貼,示例如下:

pyperclip.copy("我愛中華")pyautogui.hotkey('ctrl', 'v')
           

關于自動化控制鍵盤和滑鼠的知識點就梳理結束啦,我的頭條号裡有一個完整的示例:

《python神奇代碼之自動發微信給女友》

文章将上述這些功能串聯起來,有興趣的可以看看,覺得不錯的話給我點贊,有問題可以留言哦。

python pywinauto 單擊滑鼠_Python釋放你的雙手去成就夢想之自動化控制滑鼠鍵盤

繼續閱讀