- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 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.5 控制鼠标交互
既然你知道了如何移动鼠标,弄清楚了它在屏幕上的位置,就可以开始点击、拖动和滚动鼠标。
18.5.1 点击鼠标
要向计算机发送虚拟的鼠标点击,就调用pyautogui.click() 方法。默认情况下,点击将使用鼠标左键,点击发生在鼠标当前所在位置。如果希望点击在鼠标当前位置以外的地方发生,可以传入x、y坐标作为可选的第一第二参数。
如果想指定鼠标按键,就加入button关键字参数,值分别为 'left'、'middle'或 'right'。例如,pyautogui.click(100,150,button='left')将在坐标(100,150)处点击鼠标左键。而pyautogui.click(200,250,button='right')将在坐标(200,250)处点击右键。
在交互式环境中输入以下内容:
>>> import pyautogui >>> pyautogui.click(10, 5)
你应该看到鼠标移到屏幕左上角的位置,并点击一次。完整的“点击”是指按下鼠标按键,然后放开,同时不移动位置。实现点击也可以调用pyautogui. mouseDown(),这只是按下鼠标按键,再调用pyautogui.mouseUp(),这只是释放鼠标按键。这些函数的参数与click() 相同。实际上,click() 函数只是这两个函数调用的方便封装。
为了进一步方便,pyautogui.doubleClick() 函数只执行双击鼠标左键。pyautogui.rightClick() 和pyautogui.middleClick() 函数将分别执行双击右键和双击中键。
18.5.2 拖动鼠标
“拖动”意味着移动鼠标,同时按住一个按键不放。例如,可以通过拖动文件图标,在文件夹之间移动文件,或在日历应用中移动预约。
PyAutoGUI提供了pyautogui.dragTo() 和pyautogui.dragRel() 函数,将鼠标拖动到一个新的位置,或相对当前位置的位置。dragTo() 和dragRel() 的参数与moveTo() 和moveRel() 相同:x坐标/水平移动,y坐标/垂直移动,以及可选的时间间隔(在OS X上,如果鼠标移动太快,拖动会不对,所以建议提供duration关键字参数)。
要尝试这些函数,请打开一个绘图应用,如Windows上的Paint,OS X上的Paintbrush,或Linux上的GNU Paint(如果没有绘图应用,可以使用在线绘图,网址是http://sumopaint.com/)。我将使用PyAutoGUI在这些应用中绘图。
让鼠标停留在绘图应用的画布上,同时选中铅笔或画笔工具,在新的文件编辑窗口中输入以下内容,保存为spiralDraw.py:
import pyautogui, time ❶ time.sleep(5) ❷ pyautogui.click() # click to put drawing program in focus distance = 200 while distance > 0: ❸ pyautogui.dragRel(distance, 0, duration=0.2) # move right ❹ distance = distance - 5 ❺ pyautogui.dragRel(0, distance, duration=0.2) # move down ❺ pyautogui.dragRel(-distance, 0, duration=0.2) # move left distance = distance - 5 pyautogui.dragRel(0, -distance, duration=0.2) # move up
在运行这个程序时,会有5秒钟的延迟❶,让你选中铅笔或画笔工具,并让鼠标停留在画图工具的窗口上。然后spiralDraw.py将控制鼠标,点击画图程序获得焦点❷。如果窗口有闪烁的光标,它就获得了“焦点”,这时你的动作(例如打字,或这个例子中的拖动鼠标),就会影响该窗口。画图程序获取焦点后,spiralDraw.py将绘制一个正方形旋转图案,如图18-2所示。
图18-2 pyautogui.dragRel() 例子的结果
distance 变量从 200 开始,所以在 while 循环的第一次迭代中,第一次dragRel() 调用将光标向右拖动200像素,花了0.2秒❸。然后distance降到195❹,第二次dragRel() 调用将光标向下拖动195像素❺。第三次dragRel() 调用将光标水平拖动−195(向左195)❻,distance降到190,最后一次dragRel调用将光标向上拖动190。每次迭代,鼠标都向右、向下、向左、向上拖动,distance都比前一次迭代小一点。通过这段代码循环,就可以移动鼠标光标,画出正方形旋转图案。
可以手工画出这个漩涡(或者说用鼠标),但一定要画得很慢,才能这么精确。pyautogui能够几秒钟就画完。
注意
你可以在代码中使用pillow模块的画图函数,画出这个图形,更多信息请参见第17章。但利用GUI自动化就能使用画图程序提供的高级画图工具,如灰度、不同的画笔或填充工具。
18.5.3 滚动鼠标
最后一个pyautogui鼠标函数是scroll()。你向它提供一个整型参数,说明向上或向下滚动多少单位。单位的意义在每个操作系统和应用上不一样,所以你必须试验,看看在你的情况下滚动多远。滚动发生在鼠标的当前位置。传递正整数表示向上滚动,传递负整数表示向下滚动。将鼠标停留在IDLE窗口上,在IDLE的交互式环境中运行以下代码:
>>> pyautogui.scroll(200)
你会看到IDLE轻松地向上滚动,然后又向下滚回来。发生向下滚动是因为,在执行完指令后,IDLE自动向下滚动到底部。输入以下代码作为替代:
>>> import pyperclip >>> numbers = '' >>> for i in range(200): numbers = numbers + str(i) + '\n' >>> pyperclip.copy(numbers)
这导入了pyperclip,并建立一个空字符串numbers。代码然后循环200个数字,将每个数字和换行符加入numbers。在pyperclip.copy(numbers)之后,剪贴板中将保存200行数字。打开一个新的文件编辑窗口,将文本粘贴进去。这将得到一个很大的文本窗口,让你尝试滚动。在交互式环境中输入以下代码:
>>> import time, pyautogui >>> time.sleep(5); pyautogui.scroll(100)
在第二行,输入的两条命令以分号分隔,这告诉Python在运行这些命令时,就像它们在独立的行中一样。唯一的区别在于,交互式环境不会在两个命令之间提示你输入。这对于这个例子很重要,因为我们希望pyautogui.scroll() 调用在等待之后自动发生(请注意,虽然在交互式环境中,将两条命令放在一行中可能有用,但在你的程序中,还是应该让每条命令独占一行)。
按下回车运行代码后,你有5秒钟的时间点击文件编辑窗口,让它获得焦点。在5秒钟的延迟结束后,pyautogui.scroll() 调用将导致文件编辑窗口向上滚动。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论