PyAutoGUI 簡介

轉載來自:html

https://muxuezi.github.io/posts/doc-pyautogui.htmlgit

http://blog.topspeedsnail.com/archives/5373github

 

---------------------------------------------------------------------------------------------------------chrome

 

PyAutoGUI是一個純Python的GUI自動化工具,其目的是能夠用程序自動控制鼠標和鍵盤操做,利用它能夠實現自動化任務,不再用擔憂有重複枯燥的任務了。api

安裝:瀏覽器

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 pyautoguipost

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移動鼠標、點擊鍵盤很是快,有能夠致使其餘應用出現問題。在這種狀況下,程序可能會失控(即便是按照你的意思執行的),那時就須要中斷。若是鼠標還在自動操做,就很難在程序窗口關閉它。ui

爲了可以及時中斷,PyAutoGUI提供了一個保護措施。當pyautogui.FAILSAFE = True時,若是把鼠標光標在屏幕左上角,PyAutoGUI函數就會產生pyautogui.FailSafeException異常。若是失控了,須要中斷PyAutoGUI函數,就把鼠標光標在屏幕左上角。要禁用這個特性,就把FAILSAFE設置成False

import pyautogui
pyautogui.FAILSAFE = False

經過把pyautogui.PAUSE設置成floatint時間(秒),能夠爲全部的PyAutoGUI函數增長延遲。默認延遲時間是0.1秒。在函數循環執行的時候,這樣作可讓PyAutoGUI運行的慢一點,很是有用。例如:

import pyautogui
pyautogui.PAUSE = 2.5
pyautogui.moveTo(100,100); pyautogui.click()

全部的PyAutoGUI函數在延遲完成前都處於阻塞狀態(block)。(將來計劃增長一個可選的非阻塞模式來調用函數。)

建議PAUSEFAILSAFE一塊兒使用。

 

移動鼠標

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 LOCKNUM LOCK, 和 SCROLLLOCK 鍵

‘insert’

INSINSERT鍵

‘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') 截圖
相關文章
相關標籤/搜索