PyAutoGUI是一个能够自动化GUI操作的跨平台Python库,它的主要功能包括控制鼠标键盘以及屏幕截图和识图,简单来说就是Python版本的“按键精灵”软件,但依托Python强大的生态,PyAutoGUI能实现远比按键精灵强大的功能。PyAutoGUI能够实现很多有用的脚本,包括效率工具、自动化办公、自动化测试甚至游戏Bot。
PyAutoGUI是一个跨平台库,支持Windows、MacOS和Linux,在Windows下它直接调用Win32API,不需要额外依赖,只需要安装Python包即可。
pip install pyautogui
截屏定位功能中如果需要模糊匹配还需要额外安装opencv-python
包。
pip install opencv-python
在Linux下安装请可能还需要一些额外的依赖,具体请参考官方文档。后续内容我们都以Windows平台为例进行介绍。
GUI自动化脚本主要依赖坐标实现自动化操作,下面代码能获取屏幕的大小和当前鼠标的位置坐标,单位都是像素。
import pyautogui
# 获取屏幕大小
x, y = pyautogui.size()
print(x, y)
# 获取鼠标坐标
x, y = pyautogui.position()
print(x, y)
不过实际开发中,如果我们需要获取当前鼠标的坐标,其实更方便的做法是使用Window Spy工具,它是AutoHotKey软件的一个内置工具。直接使用Window Spy要比我们运行脚本获取坐标方便不少。
控制鼠标的位置可以使用moveTo()
和move()
函数,前者将鼠标移动到绝对坐标,后者让鼠标相对当前位置移动。
import pyautogui
# 移动鼠标到坐标
pyautogui.moveTo(1000, 1000)
# 相对当前鼠标位置移动鼠标
pyautogui.move(0, 100)
上面鼠标的移动方式是瞬时的,如果用它实现游戏Bot很容易被反作弊系统检测到,我们可以使用duration
和tween
指定插值移动方式,下面例子代码中我们实现了随机的移动时间和插值的鼠标移动轨迹。
import random
import pyautogui
import pytweening
# 移动鼠标到坐标
duration = 1 + random.randint(0, 100) / 100
pyautogui.moveTo(1000, 1000, duration=duration, tween=pytweening.easeInOutQuad)
tween
参数具体支持哪些插值算法可以参考官方文档。
下面例子演示了如何模拟键盘操作。
import pyautogui
# 模拟打字
pyautogui.write('Hello, world')
# 模拟打字,使用数组方式,带延时
pyautogui.write(['A', 'B', 'C'], interval=0.1)
# 模拟按键
pyautogui.press('esc')
# 模拟键盘按下
pyautogui.keyDown('shift')
# 模拟键盘弹起
pyautogui.keyUp('shift')
# 模拟按组合键
pyautogui.hotkey('ctrl', 'c')
截屏定位类似按键精灵的“抓抓工具”,可以实现根据一个图片在截屏上寻找对应的像素区域,这对于GUI相关的游戏Bot和自动化测试非常有用。
下面例子中,我们保存了一个按钮的图片button.png
,然后通过脚本将鼠标移动到按钮区域内的随机位置。locateOnScreen()
方法能够根据图片返回一个元组,分别对应区域的左上角X坐标、左上角Y坐标、宽度和高度。
import random
import pyautogui
import pytweening
# 在屏幕上找到坐标并移动鼠标到指定位置
x, y, w, h = pyautogui.locateOnScreen('button.png')
to_x = x + random.randint(0, w)
to_y = y + random.randint(0, h)
pyautogui.moveTo(to_x, to_y, duration=1, tween=pytweening.easeInOutQuad)
PyAutoGUI也提供了获取区域中间点的方法,我们不必自己计算。
import pyautogui
# 获取区域中间点
box_region = pyautogui.locateOnScreen('button.png')
x, y = pyautogui.center(box_region)
如果需要模糊匹配图像区域,可以使用confidence
命名参数。注意这需要安装opencv-python
包。
x, y, w, h = pyautogui.locateOnScreen('button.png', confidence=0.8)
PyAutoGUI中我们可以调用screenshot()
方法获取截屏Image
对象,此外也可以传入保存路径,直接将截屏保存到文件系统。
import pyautogui
# 获取截屏图像
screenshot = pyautogui.screenshot()
screenshot.save('C:/Users/HUAWEI/screenshot.png')
# 截屏并直接保存
pyautogui.screenshot('C:/Users/HUAWEI/screenshot.png')
前面我们介绍的PyAutoGUI截屏定位功能实现比较简陋,它是基于传统模式匹配算法实现的,如果我们希望采用更复杂的匹配算法,例如基于深度学习进行目标识别,又或者是基于OCR识别文字,那么我们就可能需要自己保存截屏实现了。