PyAutoGUI鼠標鍵盤操作使用


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')
pyautogui.screenshot#截屏
pyautogui.locateOnScreen('./img/search.png')#返回圖片所在位置
pyautogui.click(search_location)#點擊
 

保護措施(Fail-Safes)

Python移動鼠標、點擊鍵盤非常快,有可以導致其他應用出現問題。在這種情況下,程序可能會失控(即使是按照你的意思執行的),那時就需要中斷。如果鼠標還在自動操作,就很難在程序窗口關閉它。

為了能夠及時中斷,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’

BACKSPACEDELETE鍵

‘pageup’, ‘pagedown’

PAGE UPPAGE DOWN鍵

‘home’, ‘end’

HOMEEND鍵

‘up’, ‘down’, ‘left’,‘right’

箭頭鍵

‘f1’, ‘f2’, ‘f3’….

F1…….F12鍵

‘volumemute’, ‘volumedown’,‘volumeup’

有些鍵盤沒有

‘pause’

PAUSE鍵

‘capslock’, ‘numlock’,‘scrolllock’

CAPS LOCK, NUM LOCK, 和 SCROLLLOCK

‘insert’

INSINSERT鍵

‘printscreen’

PRTSCPRINT 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') 截圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM