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。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大飞哥软件自习室

希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值