使用Python進行GUI操作自動化


前言

本文介紹怎樣使用Python進行跨平台的GUI操作的,其中使用的一個工具包是pyautogui,PyAutoGUI可以模擬鼠標的移動、點擊、拖拽,鍵盤按鍵輸入、按住操作,以及鼠標+鍵盤的熱鍵同時按住等操作,可以說手能動的都可以。

安裝

首先安裝該工具包在Linux平台上的依賴
對於Python2

sudo python-xlib 

對於Python3

sudo apt-get install python3-Xlib

接着安裝pyautogui

sudo pip2 install pyautogui

測試

首先用一個簡單的示例來檢驗一下安裝是否正常(移動鼠標的位置)

>>>import pyautogui
>>> screenWidth, screenHeight = pyautogui.size()
>>> pyautogui.moveTo(screenWidth / 2, screenHeight / 2)

如果鼠標指針移動到了電腦屏幕的中間,就說明安裝的工具包可以正常工作.

一個有趣的示例:

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')

這個例子是拖動鼠標在MS paint中繪制方形螺旋形狀(任何圖形繪制程序都行):
接着

distance = 200
while 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

結果如下:

使用

一切為了安全

一切安全第一^_^,你寫的程序也許會失控哦,尤其是和GUI相關的.為了能夠及時中斷,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).

作弊條

  • 常用函數
pyautogui.position() #當前鼠標坐標 x , y
pyautogui.size() #當前屏幕的寬,高
pyautogui.onScreen(x,y) #如果(x,y)在屏幕范圍內為True
  • 安全
 pyautogui.PAUSE = 2.5 #每個PyAutoGUI調用暫停2.5秒

當pyautogui.FAILSAFE = True時,如果把鼠標光標在屏幕左上角,PyAutoGUI函數就會產生pyautogui.FailSafeException異常。

pyautogui.FAILSAFE = True
  • 鼠標相關

坐標系的原點是左上角。X軸(水平)坐標向右增大,Y軸(豎直)坐標向下增大。

num_seconds = 1.2
#  用num_seconds秒的時間把光標移動到(x, y)位置
pyautogui.moveTo(x, y, duration=num_seconds)
#  用num_seconds秒的時間把光標的X軸(水平)坐標移動xOffset,
#  Y軸(豎直)坐標向下移動yOffset。
xOffset, yOffset = 50, 100
pyautogui.moveRel(xOffset, yOffset, duration=num_seconds)

click()函數就是讓鼠標點擊,默認是單擊左鍵,參數可以設置:

pyautogui.click(x=moveToX, y=moveToY, clicks=num_of_clicks, interval=secs_between_clicks, button='left')

其中,button屬性可以設置成left,middle和right。

所有的點擊都可以用這個函數,不過下面的函數可讀性更好:

pyautogui.rightClick(x=moveToX, y=moveToY)
pyautogui.middleClick(x=moveToX, y=moveToY)
pyautogui.doubleClick(x=moveToX, y=moveToY)
pyautogui.tripleClick(x=moveToX, y=moveToY)

scroll函數控制鼠標滾輪的滾動,amount_to_scroll參數表示滾動的格數。正數則頁面向上滾動,負數則向下滾動:

pyautogui.scroll(clicks=amount_to_scroll, x=moveToX, y=moveToY)

每個按鍵按下和松開兩個事件可以分開處理:

pyautogui.mouseDown(x=moveToX, y=moveToY, button='left')
pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')
  • 鍵盤函數
    鍵盤上可以按的鍵都可以調用:
#  每次鍵入的時間間隔
secs_between_keys = 0.1
pyautogui.typewrite('Hello world!\n', interval=secs_between_keys)

多個鍵也可以:

pyautogui.typewrite(['a', 'b', 'c', 'left', 'backspace', 'enter', 'f1'], interval=secs_between_keys)

按鍵名稱列表:

pyautogui.KEYBOARD_KEYS[:10]

鍵盤的一些熱鍵像Ctrl-S或Ctrl-Shift-1都可以用hotkey()函數來實現:

pyautogui.hotkey('ctrl', 'a') # 全選
pyautogui.hotkey('ctrl', 'c') # 復制
pyautogui.hotkey('ctrl', 'v') # 粘貼

每個按鍵的按下和松開也可以單獨調用:

pyautogui.keyDown(key_name)
pyautogui.keyUp(key_name)
  • 消息彈窗函數
    如果你需要消息彈窗,通過單擊OK暫停程序,或者向用戶顯示一些信息,消息彈窗函數就會有類似JavaScript的功能:
pyautogui.alert('這個消息彈窗是文字+OK按鈕')
pyautogui.confirm('這個消息彈窗是文字+OK+Cancel按鈕')
pyautogui.prompt('這個消息彈窗是讓用戶輸入字符串,單擊OK')

在prompt()函數中,如果用戶什么都不輸入,就會返回None。

  • 截屏函數
    PyAutoGUI用Pillow/PIL庫實現圖片相關的識別和操作。

在Linux里面,你必須執行sudo apt-get install scrot來使用截屏特性。

#  返回一個Pillow/PIL的Image對象
pyautogui.screenshot()
pyautogui.screenshot('foo.png')

如果你有一個圖片文件想在上面做點擊操作,你可以用locateOnScreen()函數來定位。

#  返回(最左x坐標,最頂y坐標,寬度,高度)
pyautogui.locateOnScreen('pyautogui/looks.png')
locateAllOnScreen()函數會尋找所有相似圖片,返回一個生成器:
for i in pyautogui.locateAllOnScreen('pyautogui/looks.png'):
    print(i)
list(pyautogui.locateAllOnScreen('pyautogui/looks.png'))
locateCenterOnScreen()函數會返回圖片在屏幕上的中心XY軸坐標值:
pyautogui.locateCenterOnScreen('pyautogui/looks.png')

如果沒找到圖片會返回None。定位比較慢,一般得用1~2秒

光標位置記錄程序Python 2版本是:

import pyautogui, sys
print('Press Ctrl-C to quit.')
try:
    while True:
        x, y = pyautogui.position()
        positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
        print positionStr,
        print '\b' * (len(positionStr) + 2),
        sys.stdout.flush()
except KeyboardInterrupt:
    print '\n'

更詳細信息請訪問參考資料中的鏈接
參考資料


免責聲明!

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



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