- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
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。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论