返回介绍

18.4 项目:现在鼠标在哪里?

发布于 2024-01-22 21:44:06 字数 2520 浏览 0 评论 0 收藏 0

能够确定鼠标的位置,对于建立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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文