自動化滑鼠和鍵盤操作pyautogui
阿新 • • 發佈:2018-11-19
一 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])