PyAutoGUI是一個純Python的GUI自動化工具,其目的是可以用程序自動控制鼠標和鍵盤操作,利用它可以實現自動化任務,再也不用擔心有重復枯燥的任務了。
安裝:
pip install pyautogui
或在pipy直接下載install
在Py3中安裝提示:
Collecting PIL Could not find a version that satisfies the requirement PIL (from versions: ) No matching distribution found for PIL
依賴包PIL,Py3不支持,可以安裝Pillow 代替:PIL, 然后在install pyautogui
pip install pillow
例子
import pyautogui screenWidth, screenHeight = pyautogui.size() currentMouseX, currentMouseY = pyautogui.position() pyautogui.moveTo(100, 150) pyautogui.click() # 鼠標向下移動10像素 pyautogui.moveRel(None, 10) pyautogui.doubleClick() # 用緩動/漸變函數讓鼠標2秒后移動到(500,500)位置 # use tweening/easing function to move mouse over 2 seconds. pyautogui.moveTo(1800, 500, duration=2, tween=pyautogui.easeInOutQuad) # 在每次輸入之間暫停0.25秒 pyautogui.typewrite('Hello world!', interval=0.25) pyautogui.press('esc') pyautogui.keyDown('shift') pyautogui.press(['left', 'left', 'left', 'left', 'left', 'left']) pyautogui.keyUp('shift') pyautogui.hotkey('ctrl', 'c')
保護措施(Fail-Safes)
Python移動鼠標、點擊鍵盤非常快,有可以導致其他應用出現問題。在這種情況下,程序可能會失控(即使是按照你的意思執行的),那時就需要中斷。如果鼠標還在自動操作,就很難在程序窗口關閉它。
為了能夠及時中斷,PyAutoGUI提供了一個保護措施。當pyautogui.FAILSAFE = True
時,如果把鼠標光標在屏幕左上角,PyAutoGUI函數就會產生pyautogui.FailSafeException
異常。如果失控了,需要中斷PyAutoGUI函數,就把鼠標光標在屏幕左上角。要禁用這個特性,就把FAILSAFE
設置成False
:
import pyautogui pyautogui.FAILSAFE = False
通過把pyautogui.PAUSE
設置成float
或int
時間(秒),可以為所有的PyAutoGUI函數增加延遲。默認延遲時間是0.1秒。在函數循環執行的時候,這樣做可以讓PyAutoGUI運行的慢一點,非常有用。例如:
import pyautogui pyautogui.PAUSE = 2.5 pyautogui.moveTo(100,100); pyautogui.click()
所有的PyAutoGUI函數在延遲完成前都處於阻塞狀態(block)。(未來計划增加一個可選的非阻塞模式來調用函數。)
建議PAUSE
和FAILSAFE
一起使用。
移動鼠標
PyAutoGUI使用x,y坐標,屏幕左上角坐標是(0, 0)。
使用pyautogui.size()函數獲得屏幕的分辨率:
import pyautogui pyautogui.size() # (1366, 768) width, height = pyautogui.size()
moveTo函數,絕對坐標
import pyautogui for i in range(10): pyautogui.moveTo(300, 300, duration=0.25) pyautogui.moveTo(400, 300, duration=0.25) pyautogui.moveTo(400, 400, duration=0.25) pyautogui.moveTo(300, 400, duration=0.25)
上面代碼讓鼠標順時針移動,並划10次方框。
划圓:
import pyautogui import math width, height = pyautogui.size() r = 250 # 圓的半徑 # 圓心 o_x = width/2 o_y = height/2 pi = 3.1415926 for i in range(10): # 轉10圈 for angle in range(0, 360, 5): # 利用圓的參數方程 X = o_x + r * math.sin(angle*pi/180) Y = o_y + r * math.cos(angle*pi/180) pyautogui.moveTo(X, Y, duration=0.1)
moveRel()函數,相對坐標。以當前鼠標所在位置為基點:
import pyautogui for i in range(10): pyautogui.moveRel(100, 0, duration=0.25) pyautogui.moveRel(0, 100, duration=0.25) pyautogui.moveRel(-100, 0, duration=0.25) pyautogui.moveRel(0, -100, duration=0.25)
獲得鼠標所在坐標:
import pyautogui x, y = pyautogui.position()
實時獲得鼠標位置坐標:
import pyautogui try: while True: x, y = pyautogui.position() print(x,y) except KeyboardInterrupt: print('\nExit.')
鼠標點擊、拖拽和滾輪
鼠標點擊
使用click()函數發送虛擬鼠標點擊,默認情況下在鼠標所在的位置點擊左鍵。函數原型:
pyautogui.click(x=cur_x, y=cur_y, button='left')
- x,y是要點擊的位置,默認是鼠標當前位置
- button是要點擊的按鍵,有三個可選值:‘left’, ‘middle’, ‘right’
要在當前位置點擊右鍵:
import pyautogui pyautogui.click(button='right')
click函數完成了一次鼠標點擊。一次完整的點擊包括兩部分,按下mouseDown()和彈起mouseUp()。上面這兩個函數參數和click函數一樣,其實click函數只是簡單的封裝了mouseDown()和mouseUp()函數。
import pyautogui pyautogui.click(100, 100)
每個按鍵按下和松開兩個事件可以分開處理:
pyautogui.mouseDown(x=moveToX, y=moveToY, button='left') pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')
- pyautogui.doubleClick():鼠標雙擊,其實就是執行兩次click()函數。
- pyautogui.rightClick():右擊
- pyautogui.middleClick():中擊
鼠標拖拽
拖拽的意思是:按下鼠標鍵並拖動鼠標。PyAutoGUI提供了兩個函數:dragTo() 和 dragRel()。它的參數和moveTo() 和 moveRel() 一樣。
注意:duration時間不能太短,拖動太快有些系統會吃不消。
要做多次單擊可以設置clicks
參數,還有interval
參數可以設置每次單擊之間的時間間隔。例如:
# 雙擊左鍵 pyautogui.click(clicks=2) # 兩次單擊之間停留0.25秒 pyautogui.click(clicks=2, interval=0.25) # 三擊右鍵 pyautogui.click(button='right', clicks=2, interval=0.25)
滾輪
使用函數scroll(),它只接受一個整數。如果值為正往上滾,值為負往下滾。
pyautogui.scroll(200)
定位某個按鈕的位置
pyautogui有截屏功能
# 返回一個Pillow/PIL的Image對象 pyautogui.screenshot() pyautogui.screenshot('foo.png')
如果你不需要截取整個屏幕,還有一個可選的region
參數。你可以把截取區域的左上角XY坐標值和寬度、高度傳入截取。
im = pyautogui.screenshot(region=(0, 0, 300 ,400))
假如你有一個按鈕要10秒種點擊一下,這個任務使用上面介紹的函數可以輕松實現。但是我們假設你每次點擊這個按鈕它都會變換一個位置(隨機),這時你該怎么辦?下面我們就來解決這個問題。
首先看一下怎么使用pyautogui截屏:
import pyautogui im = pyautogui.screenshot() # 獲得某個坐標的像素 im.getpixel((50, 200)) # (30, 132, 153) # 判斷屏幕坐標的像素是不是等於某個值 pyautogui.pixelMatchesColor(50, 200, (30, 132, 153)) # True
現在我們來解決前面提出的問題。問題的關鍵是怎么找到按鈕所在的坐標。其實很簡單,首先對你要點擊的按鈕截個圖,就叫button.png吧。然后使用locateOnScreen函數找到按鈕所在的位置:
import pyautogui pyautogui.locateOnScreen('button.png') # (643, 745, 70, 29)
locateOnScreen其實就是簡單的顏色對比,如果有一個像素不匹配,它就會返回None。這個函數返回了匹配圖形的坐標,找到中間點:
x, y = pyautogui.center((643, 745, 70, 29)) # 獲得中心點 pyautogui.click(x, y)
- locateAllOnScreen():找到所有匹配的位置坐標。
要檢查XY坐標是否在屏幕上,需要用onScreen()
函數來檢驗,如果在屏幕上返回True
:
import pyautogui pyautogui.onScreen(0, 0) # True
pyautogui.onScreen(0, -1) #False
緩動/漸變(Tween / Easing)函數
緩動/漸變函數的作用是讓光標的移動更炫。如果你不需要用到的話,你可以忽略這些。
緩動/漸變函數可以改變光標移動過程的速度和方向。通常鼠標是勻速直線運動,這就是線性緩動/漸變函數。PyAutoGUI有30種緩動/漸變函數,可以通過pyautogui.ease*?
查看。其中,pyautogui.easeInQuad()
函數可以用於moveTo()
,moveRel()
,dragTo()
和dragRel()
函數,光標移動呈現先慢后快的效果,整個過程的時間還是和原來一樣。而pyautogui.easeOutQuad
函數的效果相反:光標開始移動很快,然后慢慢減速。pyautogui.easeOutElastic
是彈簧效果,首先越過終點,然后再反彈回來。例如:
# 開始很慢,不斷加速 pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad) # 開始很快,不斷減速 pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad) # 開始和結束都快,中間比較慢 pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad) # 一步一徘徊前進 pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce) # 徘徊幅度更大,甚至超過起點和終點 pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)
這些效果函數是模仿Al Sweigart的PyTweening模塊,可以直接使用,不需要額外安裝。
如果你想創建自己的效果,也可以定義一個函數,其參數是(0.0,1.0),表示起點和終點,返回值是介於[0.0,1.0]之間的數。
鍵盤按鍵
輸入字符串
pyautogui.typewrite():
import pyautogui pyautogui.click(100, 100) pyautogui.typewrite('Hello world!')
上面的字符串是一次輸入,為了唬人可以延遲輸入:
pyautogui.typewrite('Hello world!', 0.25)
PyAutoGUI輸入單個字符還可以,但是一些特殊字符怎么辦呢?例如上面輸入完Hello World,然后換行繼續輸入。
PyAutoGUI鍵盤表:
‘enter’(或‘return’ 或 ‘\n’) |
回車 |
‘esc’ |
ESC鍵 |
‘shiftleft’, ‘shiftright’ |
左右SHIFT鍵 |
‘altleft’, ‘altright’ |
左右ALT鍵 |
‘ctrlleft’, ‘ctrlright’ |
左右CTRL鍵 |
‘tab’ (‘\t’) |
TAB鍵 |
‘backspace’, ‘delete’ |
BACKSPACE 、DELETE鍵 |
‘pageup’, ‘pagedown’ |
PAGE UP 和 PAGE DOWN鍵 |
‘home’, ‘end’ |
HOME 和 END鍵 |
‘up’, ‘down’, ‘left’,‘right’ |
箭頭鍵 |
‘f1’, ‘f2’, ‘f3’…. |
F1…….F12鍵 |
‘volumemute’, ‘volumedown’,‘volumeup’ |
有些鍵盤沒有 |
‘pause’ |
PAUSE鍵 |
‘capslock’, ‘numlock’,‘scrolllock’ |
CAPS LOCK, NUM LOCK, 和 SCROLLLOCK 鍵 |
‘insert’ |
INS或INSERT鍵 |
‘printscreen’ |
PRTSC 或 PRINT SCREEN鍵 |
‘winleft’, ‘winright’ |
Win鍵 |
‘command’ |
Mac OS X command鍵 |
import pyautogui pyautogui.click(100, 100) pyautogui.typewrite('Hello world!', 0.25) pyautogui.typewrite(['enter', 'a', 'b', 'left', 'left', 'X', 'Y'], '0.25')
按鍵的按下和釋放 和鼠標按鍵非常類似。
- keyDown():按下某個鍵
- keyUp():松開某個鍵
- press():一次完整的擊鍵,前面兩個函數的組合。
alt+F4:
pyautogui.keyDown('altleft'); pyautogui.press('f4'); pyautogui.keyUp('altleft')
直接使用熱鍵函數:
pyautogui.hotkey('altleft', 'f4')
每個按鍵的按下和松開也可以單獨調用:
pyautogui.keyDown(key_name) pyautogui.keyUp(key_name)
消息彈窗函數
如果你需要消息彈窗,通過單擊OK暫停程序,或者向用戶顯示一些信息,消息彈窗函數就會有類似JavaScript的功能:
pyautogui.alert('這個消息彈窗是文字+OK按鈕') pyautogui.confirm('這個消息彈窗是文字+OK+Cancel按鈕') pyautogui.prompt('這個消息彈窗是讓用戶輸入字符串,單擊OK')
在prompt()
函數中,如果用戶什么都不輸入,就會返回None
。
應用
1.打開瀏覽器以無痕模式瀏覽網頁
import pyautogui import subprocess import win32api import time prs=subprocess.Popen(["C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe "]) time.sleep(1) pree=pyautogui.hotkey('ctrl', 'shift', 'n') time.sleep(2) pyautogui.typewrite('http://geek.csdn.net/news/detail/86546', interval=0.25) pyautogui.press('enter') pyautogui.press('enter') time.sleep(2) win32api.TerminateProcess(int(prs._handle), -1)
2.將當前屏幕最頂端應用拖拽到坐標(100,200),然后截圖
pyautogui.moveTo(200, 0, duration=0.25) pyautogui.mouseDown(button='left') # 移動到(100, 200)位置,然后松開鼠標右鍵 pyautogui.mouseUp(button='left', x=100, y=200) pyautogui.screenshot('foo.png') 截圖