18.6 处理屏幕
你的 GUI 自动化程序没有必要盲目地点击和输入。pyautogui 拥有屏幕快照的功能,可以根据当前屏幕的内容创建图形文件。这些函数也可以返回一个 Pillow 的 Image
对象,包含当前屏幕的内容。如果你是跳跃式地阅读本书,可能需要阅读第 17 章,安装 pillow 模块,然后再继续本节的内容。
在 Linux 计算机上,需要安装 scrot 程序,才能在 pyautogui 中使用屏幕快照功能。在终端窗口中,执行 sudo apt-get install scrot,安装该程序。如果你使用
Windows或 OS X,就跳过这一步,继续本节的内容。
18.6.1 获取屏幕快照
要在Python 中获取屏幕快照,就调用 pyautogui.screenshot() 函数。在交互式环境中输入以下内容:
>>> import pyautogui
>>> im = pyautogui.screenshot()
im 变量将包含一个屏幕快照的 Image 对象。现在可以调用 im 变量中 Image 对象的方法,就像所有其他 Image 对象一样。在交互式环境中输入以下内容:
>>> im.getpixel((0, 0))
(176, 176, 175)
>>> im.getpixel((50, 200))
(130, 135, 144)
向 getpixel() 函数传入坐标元组,如(0,0)或(50,200),它将告诉你图像中这些坐标处的像素颜色。getpixel() 函数的返回值是一个RGB 元组,包含 3
个整数,表示像素的红绿蓝值(没有第四个值表示 alpha,因为屏幕快照是完全不透明的)。这就是你的程序“看到”当前屏幕上内容的方法。
18.6.2 分析屏幕快照
假设你的GUI 自动化程序中,有一步是点击灰色按钮。在调用 click()
方法之前,你可以获取屏幕快照,查看脚本要点击处的像素。如果它的颜色和灰色按钮不一样,那么程序就知道出问题了。也许窗口发生了意外的移动,或者弹出式对话框挡住了
该按钮。这时,不应该继续(可能会点击到错误的东西,造成严重破坏),程序可以 “看到”它没有点击在正确的东西上,并自行停止。
如果屏幕上指定的 x、y 坐标处的像素与指定的颜色匹配,PyAutoGUI 的 pixelMatchesColor() 函数将返回 True。第一和第二个参数是整数,对应 x 和 y
坐标。第三个参数是一个元组,包含 3 个整数,是屏幕像素必须匹配的 RGB 颜色。在交互式环境中输入以下内容:
>>> 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
在获取屏幕快照,并用 getpixel() 函数取得特定坐标处像素颜色的RGB 元组之后➊,将同样的坐标和 RGB 元组传递给pixelMatchesColor()
➋,这应该返回True。然后改变 RBG 元组中的一个值,用同样的坐标再次调用 pixelMatches Color() ➌,这应该返回
False。你的 GUI 自动化程序要调用 click() 之前,这种方法应该有用。请注意,给定坐标处的颜色应该“完全”匹配。即使只是稍有差异(例如,是(255,
255,254)而不是(255,255,255)),那么函数也会返回 False。