前言:
本章節有個非常重要的函數 locateCenterOnScreen!
如果你有一個圖像文件,你可以在屏幕上直觀地定位一些東西。
它直接返回x,y坐標點,返回值可以給click()
PyAutoGUI可以獲取屏幕截圖,將它們保存到文件中,並在屏幕中識別並定位圖像。這是有用的,如果你有一個小的圖像,比方說,一個按鈕,需要點擊,並希望找到它在屏幕上。這些特性由PyScreeze模塊提供,該模塊與PyAutoGUI一起安裝
截圖功能需要依賴pillow模塊。
OSX使用screencapture命令,它與操作系統一起提供。
Linux使用scrot命令,可以通過運行sudo apt-get install scrot.
關於Ubuntu的特別說明
Ubuntu在安裝 pillow 方面似乎有一些缺陷。PNG和JPEG支持不包括在Ubuntu上的pillow中。以下鏈接有更多信息:https://stackoverflow.com/questions/7648200/pip-install-pil-e-tickets-1-no-jpeg-png-support http://ubuntuforums.org/showthread.php?t=1751455
import pyautogui as auto
屏幕截圖()函數
screenshot()
將返回 Image 對象(有關詳細信息,請參閱枕頭或PIL模塊文檔)。傳遞文件名的字符串將屏幕快照保存到文件中,並將其作為Image對象返回。
# 有一個可選的 region 關鍵字參數,如果不希望看到整個屏幕的截圖。
# 可以傳遞區域的左、頂、寬和高的四個整數元組來捕獲:
pic_1 = auto.screenshot()
pic_2 = auto.screenshot('my_screenshot.png') #在1920 x 1080屏幕上,screenshot()函數大約需要100毫秒
pic_3 = auto.screenshot("my_screenshot.png ",region=(0,0, 300, 400))
定位函數 (非常重要)
在#1920 x 1080屏幕上,定位函數調用大約需要1或2秒 ,不適用於游戲腳本調用,原因是太慢
locateOnScreen()
例如,假設計算器應用程序在您的計算機上運行,如下所示:

# 當啟動計算器界面的時候,這時您不能直接調用moveTo()和click()函數,如果您不知道計算器按鈕的確切屏幕坐標。
# 每次啟動時,計算器都會出現在一個稍微不同的地方,因此每次都需要重新查找坐標。
# 但是,如果您有該按鈕的圖像,例如7按鈕的圖像:

# 就直接用圖片識別功能定位它的屏幕坐標(是元組,左、上、右、下),這個返回結果(元組)也可以給center()函數方法,轉化成x,y的坐標值
# 如果屏幕上找不到圖像,locateOnScreen() 則返回結果為:None.
number7_location = auto.locateOnScreen('calc7key.png') #傳入按鈕的圖片
print(number7_location) # 返回屏幕所在位置
>>>(1416, 562, 50, 41)
x,y = auto.center(number7_location ) # 轉化為 x,y坐標
print(number7_location) #按鍵7的坐標是1441,582
>>> (1441, 582)
auto.click(number7_location)
# 點擊坐標,click()它是支持元組格式的坐標傳入的
#根據圖片識別定位x,y坐標(比較好用)
locateCenterOnScreen(image, grayscale=False)
返回找到的第一個截圖Image對象在屏幕上的中心坐標(x, y),如果沒找到返回None
auto.locateCenterOnScreen('1.png',grayscale=False)
# 參數grayscale是是否轉灰度
>>> (1441, 582)
locateAllOnScreen(image, grayscale=False)
# 返回找到的所有相同截圖Image對象在屏幕上的坐標,返回結果是(left, top, width, height)的‘生成器’
auto.locateAllOnScreen('xxx.png',grayscale=False) #遍歷找到屏幕上所有顯示為xxx的圖像對象坐標,轉灰度操作=關閉
locate(needleImage, haystackImage, grayscale=False)
auto.locate('xxx.png')
# 返回找到的第一個截圖Image對象在haystackImage里面的坐標(left, top, width, height),如果沒找到返回None
locateAll(needleImage, haystackImage, grayscale=False)
auto.locateAll('xxx.png')
# 返回找到的所有相同截圖Image對象在haystackImage里面的坐標(left, top, width, height)的生成器