1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python自動(dòng)操作 GUI 神器——PyAutoGUI

        共 4411字,需瀏覽 9分鐘

         ·

        2022-06-25 09:52

        我們以前講過怎樣使用 Python 在瀏覽器中實(shí)現(xiàn)頁面自動(dòng)化操作,不管用哪種方式實(shí)現(xiàn),都是通過定位頁面中的元素來進(jìn)行相應(yīng)的操作。

        今天我們來聊一聊如何在桌面實(shí)現(xiàn)自動(dòng)化操作。與瀏覽器頁面自動(dòng)化操作類似,桌面自動(dòng)化操作也是需要定位鼠標(biāo)在桌面的位置,然后根據(jù)定位的位置執(zhí)行對應(yīng)的操作。

        GUI 控制神器

        我們今天的主人公是 pyautogui,pyautogui 是一個(gè)純 Python 的 GUI 自動(dòng)化工具,通過它可以讓程序自動(dòng)控制鼠標(biāo)和鍵盤的一系列操作來達(dá)到自動(dòng)化測試的目的。

        這個(gè)模塊的安裝也是老一套:

        pip3 install pyautogui

        安裝好了就可以直接使用了。

        鼠標(biāo)操作

        鼠標(biāo)移動(dòng)

        桌面操作最基本的就是鼠標(biāo)操作了,我們可以控制鼠標(biāo)的移動(dòng):

        # 移動(dòng)鼠標(biāo)
        pyautogui.moveTo(200,400,duration=2)
        pyautogui.moveRel(200,500,duration=2)

        整個(gè)桌面是以左上角為坐標(biāo)軸的原點(diǎn),所有的操作都以這個(gè)原點(diǎn),來確定操作位置。

        第一行是將鼠標(biāo)移動(dòng)到指定的像素(200,400)位置,第二行代碼是將鼠標(biāo)按照當(dāng)前點(diǎn)向右移動(dòng)200px,向下移動(dòng)400px這個(gè)方向移動(dòng)。

        兩行代碼中都有一個(gè)共同的參數(shù) duration,這個(gè)參數(shù)表示移動(dòng)時(shí)間,即在指定時(shí)間內(nèi)完成移動(dòng)操作,單位是秒。

        運(yùn)行這兩行代碼,觀察屏幕鼠標(biāo)的變化,是不是很神奇?

        我們還可以獲取鼠標(biāo)位置:

        print(pyautogui.position())  

        這個(gè)很好理解,就是獲取鼠標(biāo)在當(dāng)前屏幕中的坐標(biāo)位置,運(yùn)行這行代碼,我們會得到諸如下面的信息:

        Point(x=400, y=900)

        鼠標(biāo)點(diǎn)擊

        通常,我們的鼠標(biāo)有左右兩個(gè)按鍵,高級點(diǎn)的鼠標(biāo)中間還有個(gè)按鍵。

        我的鼠標(biāo)只有兩個(gè)按鍵,中間沒有按鍵,唉~

        pyautogui針對這三個(gè)按鍵操作都有相應(yīng)的處理:

        # 鼠標(biāo)點(diǎn)擊,默認(rèn)左鍵
        pyautogui.click(100,100)   
        # 單擊左鍵
        pyautogui.click(100,100,button='left')  
        # 單擊右鍵
        pyautogui.click(100,300,button='right'
        # 單擊中間 
        pyautogui.click(100,300,button='middle')  

        鼠標(biāo)點(diǎn)擊,如果不指定 button 參數(shù),默認(rèn)是點(diǎn)擊左鍵,前面兩個(gè)參數(shù)就是點(diǎn)擊坐標(biāo)的位置。

        運(yùn)行這段代碼,看看你的桌面會發(fā)生什么?

        鼠標(biāo)除了點(diǎn)擊操作,還有雙擊操作:

        # 雙擊左鍵
        pyautogui.doubleClick(10,10)  
        # 雙擊右鍵
        pyautogui.rightClick(10,10)   
        # 雙擊中鍵
        pyautogui.middleClick(10,10

        操作函數(shù)也很簡單,相信大家一眼就能看明白,如果一眼看不明白,請多看幾眼!

        熟悉前端的小伙伴可能會馬上聯(lián)想到,鼠標(biāo)操作有按下和釋放的過程,我們屏幕操作也有對應(yīng)的控制:

        # 鼠標(biāo)按下
        pyautogui.mouseDown()   
        # 鼠標(biāo)釋放
        pyautogui.mouseUp()    

        鼠標(biāo)拖動(dòng)

        我們可以控制鼠標(biāo)拖動(dòng)到指定坐標(biāo)位置,并且設(shè)置操作時(shí)間:

        pyautogui.dragTo(100,300,duration=1)   

        這個(gè)運(yùn)行效果和前面移動(dòng)類似。

        根據(jù)前面移動(dòng)的經(jīng)驗(yàn),我們也有按照方向拖動(dòng)鼠標(biāo):

        pyautogui.dragRel(100,300,duration=4

        鼠標(biāo)滾動(dòng)

        在桌面操作中,我們有時(shí)候需要滾動(dòng)鼠標(biāo)到達(dá)向上或者向下的位置,這時(shí)候我們可以使用 scroll 這個(gè)函數(shù)來控制:

        pyautogui.scroll(30000

        參數(shù)是整數(shù),表示向上或向下滾動(dòng)多少個(gè)單位,這個(gè)單位根據(jù)不同的操作系統(tǒng)可能不一樣。如果向上滾動(dòng),傳入正整數(shù),向下滾動(dòng)傳入負(fù)整數(shù)。

        屏幕處理

        獲取屏幕截圖

        我們先來假設(shè)一個(gè)場景:我現(xiàn)在要在屏幕上找到一個(gè)紅色的點(diǎn),你會怎么做?通常的做法是拿到這個(gè)紅色點(diǎn)的顏色值,然后再對屏幕上的點(diǎn)逐個(gè)進(jìn)行比較,直到找到為止。

        pyautogui 為我們這個(gè)操作場景提供了支持,分別有三個(gè)函數(shù)可以完成這三件事情。

        im = pyautogui.screenshot()
        im.save('screenshot.png')
        rgb = im.getpixel((100500))
        print(rgb)
        match = pyautogui.pixelMatchesColor(500,500,(12,120,400))
        print(match)

        第一個(gè)是獲取屏幕截圖函數(shù),它可以返回一個(gè) Pillow 的 image 對象; 第二個(gè)是獲取屏幕截圖中指定坐標(biāo)點(diǎn)的顏色,返回 rgb 顏色值;第三個(gè)是將指定坐標(biāo)點(diǎn)的顏色和目標(biāo)的顏色進(jìn)行比對,返回布爾值。

        我們再來升級一下需求:

        我現(xiàn)在要在屏幕上找到 edge 瀏覽器的圖標(biāo),你會怎么做?

        通常的做法是先知道 edge 瀏覽器的圖標(biāo)長啥樣,是綠色還是藍(lán)色,是胖的還是瘦的,對吧?然后再在屏幕上去進(jìn)行圖標(biāo)的匹配,直到找到一個(gè)圖標(biāo)跟我們目標(biāo)圖標(biāo)一樣,就得到了結(jié)果。

        于是,我們的代碼如下:

        # 圖像識別(一個(gè))
        oneLocation = pyautogui.locateOnScreen('1.png')
        print(oneLocation)  

        # 圖像識別(多個(gè))
        allLocation = pyautogui.locateAllOnScreen('1.png')
        print(list(allLocation))

        你可以在桌面上將某個(gè)應(yīng)用的圖標(biāo)截取下來,保存為圖片,然后使用上面幾行代碼來識別,識別成功,你會返回類似下面的結(jié)果:

        Box(left=20, top=89, width=33, height=34)
        [Box(left=20, top=89, width=33, height=34)]

        這就是圖片在桌面的位置,如果找不到圖片,就會返回 None。

        鍵盤輸入

        鍵盤函數(shù)

        鍵盤輸入有下面幾個(gè)常用的函數(shù):

        • keyDown():模擬按鍵按下
        • keyUP():模擬按鍵松開
        • press():模擬一次按鍵過程,即 keyDown 和 keyUP 的組合
        • typewrite():模擬鍵盤輸出內(nèi)容

        舉個(gè)例子,大家平時(shí)輸入感嘆號(?。┦窃趺床僮麈I盤的?

        按住 shift 按鍵,然后再按住 1 按鍵,就可以了。用 pyautogui 控制就是:

        pyautogui.keyDown('shift')    
        pyautogui.press('1')    
        pyautogui.keyUp('shift')   

        運(yùn)行上面的代碼,如果你的鼠標(biāo)是放在編輯框中,你會得到一個(gè)感嘆號!

        我們還可以直接輸出內(nèi)容:

        pyautogui.typewrite('python'1)

        第一個(gè)參數(shù)是輸出的內(nèi)容,第二個(gè)參數(shù)是間隔時(shí)間,單位是秒。

        運(yùn)行上面代碼,你的編輯器里面就會每隔1秒鐘按順序輸出 python 的6個(gè)字母。

        特殊符號

        有時(shí)我們需要輸入鍵盤的一些特殊的符號按鍵,比如 換行、方向鍵等,這些有相對應(yīng)的鍵盤字符串表示:

        pyautogui.typewrite(['p','y','t','h','o','n','enter'])   

        運(yùn)行上面代碼,編輯器里面就會輸出 python 之后換行。

        其他特殊按鍵對應(yīng)的字符串請參考官方說明。

        快捷鍵

        如果我要復(fù)制一個(gè)內(nèi)容,大部分情況下會使用快鍵鍵 ctrl + c,按照上面講的,我們應(yīng)該這么實(shí)現(xiàn):

        pyautogui.keyDown('ctrl')
        pyautogui.keyDown('c')
        pyautogui.keyUp('c')
        pyautogui.keyUp('ctrl')

        這樣寫起來很麻煩,而且需要掌控按鍵的按下和釋放的順序。

        pyautogui 為我們提供了一個(gè)快捷的函數(shù):

        pyautogui.hotkey('ctrl','c')

        實(shí)現(xiàn)的效果和上面的4行代碼相同。

        信息框

        當(dāng)你在模擬一個(gè)桌面操作的時(shí)候,如果有分支操作需要根據(jù)實(shí)際情況來判斷,你是不是需要有一個(gè)地方可以讓你選擇走哪個(gè)分支?

        pyautogui 貼心地考慮到了這種情況,你可以通過彈出一個(gè)選擇框來中斷當(dāng)前的操作,選擇操作分支。

        way = pyautogui.confirm('領(lǐng)導(dǎo),該走哪條路?', buttons=['農(nóng)村路''水路''陸路'])
        print(way)

        這里就是我們 HTML 頁面的 confirm 選擇框,選擇了選項(xiàng)之后,我們可以獲取到選擇的選項(xiàng),然后基于這個(gè)選項(xiàng)做判斷,進(jìn)入相應(yīng)的操作分支。

        除了選擇確認(rèn)框之外,還有其他一些提示信息框:

        # 警告框
        alert = pyautogui.alert(text='警告!敵軍來襲!', title='警告框')
        print(alert)
        # 密碼框
        password = pyautogui.password('請輸入密碼')
        print(password)
        # 普通輸入框
        input = pyautogui.prompt('請輸入指令:')
        print(input)

        總結(jié)

        pyautogui 的基本知識就給大家介紹到這里,這個(gè) python 模塊的功能十分強(qiáng)大,函數(shù)都非常簡單,對 python 初學(xué)者比較友好。學(xué)了這些基本知識之后,你可以運(yùn)用這些基本知識的組合,去實(shí)現(xiàn)一些有趣的桌面自動(dòng)化操作,快去嘗試一把吧!

        往期推薦
        1、這不會又是一個(gè)Go的BUG吧?
        2、Python處理辦公自動(dòng)化的10大場景!
        3、一次Python爬蟲實(shí)戰(zhàn),解決反爬問題!
        4、13個(gè)Python必備的知識,建議收藏!
        5、這幾個(gè) Python 小游戲,上班摸魚我能玩一天 | 內(nèi)附源碼
        點(diǎn)擊關(guān)注公眾號,閱讀更多精彩內(nèi)容
        瀏覽 59
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            爆操久久 | 中国飞机上一级毛片 | 女女强制h百合调教gl在线看 | 豆花视频最新网址 | 精产国品少妇在线视频 | 成人无码另类电影 | 动漫艳姆1~6集无删减版 | 攻受男男肉不打码视频免费 | 申鹤被到爽高潮痉挛视频 | 又黄又爽的视频在线观看网站 |