- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 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.4 项目:现在鼠标在哪里?
能够确定鼠标的位置,对于建立GUI自动化脚本是很重要的。但光看屏幕,几乎不能弄清楚像素的准确坐标。如果有一个程序在移动鼠标时随时显示 x y坐标,就会很方便。
总的来说,你希望该程序做到:
· 获得鼠标当前的xy坐标。
· 当鼠标在屏幕上移动时,更新这些坐标。
这意味着代码需要做到下列事情:
· 调用函数取得当前坐标。
· 在屏幕上打印回退制服。删除以前打印的坐标。
· 处理异常。让用户能按键退出。
打开一个新的文件编辑器窗口,将它保存为mouseNow.py。
第1步:导入模块
程序开始是这样的:
#! python3 # mouseNow.py - Displays the mouse cursor's current position. import pyautogui print('Press Ctrl-C to quit.') #TODO: Get and print the mouse coordinates.
程序开始导入了pyautogui模块,打印的内容提醒用户按Ctrl-C退出。
第2步:编写退出代码和无限循环
可以用无限 while 循环,不断打印通过mouse.position() 获得的当前鼠标坐标。对于退出程序的代码,你需要捕捉 KeyboardInterrupt 异常,它会在用户按下 Ctrl-C 时抛出。如果不处理这个异常,它会向用户显示丑陋的调用栈和出错信息。将下面内容添加到程序中:
#! python3 # mouseNow.py - Displays the mouse cursor's current position. import pyautogui print('Press Ctrl-C to quit.') try: while True: # TODO: Get and print the mouse coordinates. ❶ except KeyboardInterrupt: ❷ print('\nDone.')
为了处理这个异常,将无限while循环放在一个try语句中。当用户按下Ctrl-C,程序执行将转到except子句❶,新行中将输出Done❷。
第3步:获取并打印鼠标坐标
while循环内的代码应该获取当前鼠标的坐标,提供好看的格式,并打印输出。在while循环内添加以下代码:
#! python3 # mouseNow.py - Displays the mouse cursor's current position. import pyautogui print('Press Ctrl-C to quit.') --snip-- # Get and print the mouse coordinates. x, y = pyautogui.position() positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4) --snip--
利用多重赋值的技巧,变量x、y得到了pyautogui.position() 返回元组中的两个整型值。将x、y传递给str() 函数,可以得到整型坐标的字符串形式。rjust() 字符串方法将对坐标右调整,让它们占据同样的宽度,不论坐标是一位、两位、三位或四位数字。连接右调准的字符串坐标,加上 'X: ' 和 ' Y: ' 标签,就得到了格式化好的字符串,保存在positionStr中。
在程序的末尾,添加以下代码:
#! python3 # mouseNow.py - Displays the mouse cursor's current position. --snip-- print(positionStr, end='') ❶ print('\b' * len(positionStr), end='', flush=True)
这将在屏幕上打印positionStr。print() 函数的关键字参数end='' 阻止了在打印行末添加默认的换行字符。这可能会擦除你已经在屏幕上打印的文本,但只是最近一行文本。如果你先打印了一个换行字符,就不会擦除以前打印的内容。
要擦除文本,就打印\b 退格转义字符。这个特殊字符擦除屏幕当前行末尾的字符。代码行❶利用字符串复制,得到了许多\b 字符构成的字符串,长度与positionStr中保存的字符串长度一样,效果就是擦除了前面打印的字符串。
print() 调用打印\b退格键字符时,总是传入flush=True(其技术上的理由超出了本书的范围)。否则,屏幕可能不会按期望更新。
while循环重复非常快,用户实际上不会注意到你在屏幕上删除并重新打印整个数字。例如,如果x坐标是563,鼠标右移一个像素,看起来就像563中的3变成了4。
如果运行程序,只有两行打印输出。看起来像这样:
Press Ctrl-C to quit. X: 290 Y: 424
第一行显示指令:按Ctrl-C退出。第二行显示鼠标坐标,当你在屏幕上移动鼠标时,会变化。利用这个程序,就能搞清楚鼠标坐标,用于你的GUI自动化脚本。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论