1. 程式人生 > >自動化滑鼠和鍵盤操作pyautogui

自動化滑鼠和鍵盤操作pyautogui

一  pyautogui模組簡要說明

## 使用 pyautogui 模組相關函式,可以模擬滑鼠及鍵盤操作, 完整說明文件見: http://pyautogui.readthedocs.org/
# pip install pyautogui
# 要注意的是,模擬移動滑鼠與擊鍵可能太快,導致其他程式跟不上,並且程式可能失去控制,
# 需要掌握如何從問題中恢復,至少要能中止它。
# 防止或恢復GUI自動化問題
#   1) 使用pyautogui.PAUSE設定每個PyAutoGUI函式呼叫在執行動作後暫停的秒數
#   2) pyautogui自動防故障功能:將滑鼠移到螢幕的左上角,來丟擲failSafeException異常

二  控制滑鼠移動與互動

三  螢幕快照與識別比較

四  控制鍵盤

五  綜合例子

具體見以下程式碼及說明:

## 使用 pyautogui 模組相關函式,可以模擬滑鼠及鍵盤操作, 完整說明文件見: http://pyautogui.readthedocs.org/
# pip install pyautogui
# 要注意的是,模擬移動滑鼠與擊鍵可能太快,導致其他程式跟不上,並且程式可能失去控制,
# 需要掌握如何從問題中恢復,至少要能中止它。
# 防止或恢復GUI自動化問題
#   1) 使用pyautogui.PAUSE設定每個PyAutoGUI函式呼叫在執行動作後暫停的秒數
#   2) pyautogui自動防故障功能:將滑鼠移到螢幕的左上角,來丟擲failSafeException異常
import pyautogui
pyautogui.PAUSE = 1
pyautogui.FAILSAFE = True           # 啟用自動防故障功能
width,height = pyautogui.size()     # 螢幕的寬度和高度
pyautogui.position()                # 滑鼠當前位置
 
## 控制滑鼠移動
for i in range(10):
    pyautogui.moveTo(100,100,duration=0.25)      # 移動到 (100,100)
    pyautogui.moveTo(200,100,duration=0.25)
    pyautogui.moveTo(200,200,duration=0.25)
    pyautogui.moveTo(100,200,duration=0.25)
 
for i in range(10):
    pyautogui.moveRel(100,0,duration=0.25)       # 從當前位置右移100畫素
    pyautogui.moveRel(0,100,duration=0.25)       # 向下
    pyautogui.moveRel(-100,0,duration=0.25)      # 向左
    pyautogui.moveRel(0,-100,duration=0.25)      # 向上
 
## 例子:持續獲取滑鼠位置並更新顯示
# 1.獲取當前座標
# 2.在螢幕上列印,並刪除之前列印的座標
# 3.處理異常,並能按鍵退出
# Displays the mouse cursor's currrent position.
import pyautogui
print('Press Ctrl-C to quit.')
try:
    while True:
        # Get and print the mouse coordinates.
        x,y = pyautogui.position()
        positionStr = 'X: '+str(x).rjust(4)+' Y:'+str(y).rjust(4)
        pix = pyautogui.screenshot().getpixel((x,y))   # 獲取滑鼠所在螢幕點的RGB顏色
        positionStr += ' RGB:('+str(pix[0]).rjust(3)+','+str(pix[1]).rjust(3)+','+str(pix[2]).rjust(3)+')'
        print(positionStr,end='')                      # end='' 替換了預設的換行
        print('\b'*len(positionStr),end='',flush=True) # 連續退格鍵並重新整理,刪除之前列印的座標,就像直接更新座標效果
except KeyboardInterrupt:                              # 處理 Ctrl-C 按鍵
    print('\nDone.')
 
## 控制滑鼠互動
# pyautogui.click() 封裝了 pyautogui.mouseDown()和pyautogui.mouseUp(), 這兩個函式也可以單獨使用
# pyautogui.doubleClick() 雙擊左鍵, pyautogui.rightClick() 雙擊右鍵,pyautogui.middleClick() 雙擊中鍵
import pyautogui
pyautogui.click(10,5)                     # 在(10,5)單擊滑鼠,預設左鍵
pyautogui.click(100,150,button='left')
pyautogui.click(200,250,button='right')
# pyautogui.dragTo()    按鍵並拖動滑鼠移動,引數為座標,與moveTo相同
# pyautogui.dragRel()   按鍵並拖動滑鼠移動,引數為距離,與moveRel相同
 
import pyautogui,time
time.sleep(5)
# 這裡停頓5秒,用於手工開啟windows繪圖應用,並選中鉛筆或畫圖工具,讓滑鼠停留在畫圖工具的視窗中
# 或使用線上paint (http://sumopaint.com)
pyautogui.click()      # click to put drawing program in focus
distance = 200
while distance > 0 :
    pyautogui.dragRel(distance,0,duration=0.2)  # move right
    distance = distance - 5
    pyautogui.dragRel(0,distance,duration=0.2)  # move down
    pyautogui.dragRel(-distance,0,duration=0.2) # move left
    distance = distance - 5
    pyautogui.dragRel(0,-distance,duration=0.2) # move up
print('Done')
 
pyautogui.scroll(200)         # 滑鼠向上滾動200畫素
pyautogui.scroll(-100)        #     負數向下
 
import pyperclip
numbers = ''
for i in range(200):
    numbers = numbers + str(i) + '\n'
pyperclip.copy(numbers)
print(numbers)
# 這裡手動開啟一個文字視窗,貼上
import time,pyautogui
time.sleep(5);pyautogui.scroll(100)
 
## 分析螢幕快照
import pyautogui
im = pyautogui.screenshot()     # 獲取螢幕快照
im.getpixel((50,200))           # (130,135,144)
pyautogui.pixelMatchesColor(50,200,(130,135,144))   # True  可用來判斷螢幕是否發生變化
pyautogui.pixelMatchesColor(50,200,(255,135,144))   # False
# 影象定位識別
pyautogui.locateOnScreen('submit.png')   # 在螢幕上查詢匹配與檔案相同的區域--每個區域畫素都要相同 左,頂,寬,高
pyautogui.center(pyautogui.locateOnScreen('submit.png'))  # 獲取匹配影象中心點座標
pyautogui.click((678,759))               # 點選該區域核心
list(pyautogui.locateAllOnScreen('submit.png'))   # 匹配到多處,返回區域list
 
## 控制鍵盤
pyautogui.click(100,100);pyautogui.typewrite('Hello python')
pyautogui.typewrite(['a','b','left','left','X','Y'])  # typewrite可傳入擊鍵列表,這裡輸出XYab,left是左箭頭
print(pyautogui.KEYBOARD_KEYS)           # pyautogui接受的所有可能字串
 
pyautogui.press('enter')                 # 接受按鍵命令
pyautogui.keyDown('shift');pyautogui.press('4');pyautogui.keyUp('shift')    # 輸出 $ 符號的按鍵
#熱鍵組合
pyautogui.keyDown('ctrl')
pyautogui.keyDown('c')
pyautogui.keyUp('c')
pyautogui.keyUp('ctrl')
# 這四句是組合 ctrl-c,類似這種順序按下,再反序釋放的,可以用hotkey()
pyautogui.hotkey('ctrl','c')                # 同上面四句,組合鍵
pyautogui.hotkey('ctrl','alt','shift','s')  # Ctrl-Alt-Shift-S 熱鍵組合
 
## 綜合例子: 自動填表程式
# http://autbor.com/form
# 將電子表格中的大量資料自動輸入到另一個應用的表單介面
# 1.點選表單的第一個文字欄位
# 2.遍歷表單,再每個輸入欄鍵入資訊
# 3.點選submit按鈕
# 4.用下一組資料重複這個過程
# Automatically fills in the form.
 
import pyautogui,time
# set these to the correct coordinates for your computer.
nameField = (648,319)
submitButton = (651,817)
submitButtonColor = (75,141,249)
submitAnotherLink = (760,224)
 
formData = [{'name':'Alice','fear':'eavppers','source':'wand','robocop':4,'comments':'Tell us'},
            {'name':'Bog','fear':'eaves','source':'crystal','robocop':4,'comments':'Big room'},
            {'name':'Kad','fear':'apple','source':'woold','robocop':1,'comments':'Nice day'},
            {'name':'Cace','fear':'ppers','source':'ball','robocop':5,'comments':'n/a'}
           ]
pyautogui.PAUSE = 0.5
for person in formData:
    # Give the user a chance to kill the script.
    print('>>> 5 SECOND PAUSE TO LET USER PRESS CTRL-C <<<')
    time.sleep(5)
    # Wait until the form page has loaded.
    while not pyautogui.pixelMatchesColor(submitButton[0],submitButton[1],submitButtonColor):
        time.sleep(0.5)
    print('Entering %s info...' % (person['name']))
    pyautogui.click(nameField[0],nameField[1])       # 單擊第一個文字欄位輸入位置
    # Fill out the Name field.
    pyautogui.typewrite(person['name']+'\t')         # 輸入該域,並按下 tab 鍵,將焦點轉向下一個輸入框
    # Fill out the Greatest Fear(s) field.
    pyautogui.typewrite(person['fear']+'\t')
    # 處理下拉框
    # Fill out the Source of Wizard Powers Field
    if person['source'] == 'wand':
        pyautogui.typewrite(['down','\t'])
    elif person['source'] == 'crystal':
        pyautogui.typewrite(['down','down','\t'])
    elif person['source'] == 'woold':
        pyautogui.typewrite(['down','down','down','\t'])
    elif person['source'] == 'ball':
        pyautogui.typewrite(['down','down','down','down','\t'])                
    # 處理單選按鈕
    # Fill out the RoboCop field
    if person['robocop'] == 1:
        pyautogui.typewrite([' ','\t'])
    elif person['robocop'] == 2:
        pyautogui.typewrite(['right','\t'])
    elif person['robocop'] == 3:
        pyautogui.typewrite(['right','right','\t'])
    elif person['robocop'] == 4:
        pyautogui.typewrite(['right','right','right','\t'])
    elif person['robocop'] == 5:
        pyautogui.typewrite(['right','right','right','right','\t'])
    # Fill out the Additional Comments field.
    pyautogui.typewrite(person['comments']+'\t')
    # Click Submit.
    pyautogui.press('enter')
    # Wait until form page has loaded.
    print('Clicked submit.')
    time.sleep(5)
    # Click the Submit another response link.
    pyautogui.click(submitAnotherLink[0],submitAnotherLink[1])