返回介绍

18.5 控制鼠标交互

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

既然你知道了如何移动鼠标,弄清楚了它在屏幕上的位置,就可以开始点击、拖动和滚动鼠标。

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 技术交流群。

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

发布评论

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