Python学习笔记——用GUI自动化控制键盘和鼠标
安装pyautogui模块
pyautogui模块可以向Windows、OSX和Linux发送虚拟按键和鼠标点击。
安装依赖
- 在Windows上,不需要安装其他模块。
- 在OSX上,运行
sudo pip3 install pyobjc-framework-Quartz
sudo pip3 install pyobjc-core
sudo pip3 install pyobjc
- 在Linux上,运行
sudo pip3 install python3-xlib
sudo apt-get install scrot
sudo apt-get install python3-tk
sudo apt-get install python3-dev
#(Scrot是PyAutoGUI使用的屏幕快照程序)。
在这些依赖安装后,运行pip install pyautogui(或在OSX和Linux上运行pip3),安装pyautogui。
1. 异常情况处理
Python能以想象不到的速度移动并点击,它可能由于速度太快导致其他应用程序跟不上。以下有几种方法来防止和恢复自动化问题。
1.1 注销关闭所有程序来恢复系统。
1.2 暂停和自动防故障装置
- 设置pyautogui.PAUSE = 1.5之后每个PythonGUI函数调用在执行动作之后,都会暂停1.5s,非PyAtuGUI指令不会暂停
- 将鼠标移动到左上角将产生pyautogui.FailSafeException异常,可以设置pyautogui.FAILSAFE=False,禁用自动防故障功能。
2 控制鼠标
获取屏幕宽高:
#屏幕分辨率的不同,返回值可能不一样.
width, height = pyautogui.size()
2.1 鼠标移动
-
moveto
# 移动到x, y 坐标处,用时0.25s pyautogui.moveto(x, y, duration=0.25)
-
moveRel
# 相对于当前位置移动鼠标,x、y可以为负数 pyautogui.moveRel(x, y, duration=0.25)
-
获取鼠标当前的位置
调用pyautogui.position(),可以获得鼠标当前的位置。它将返回函数调用时,鼠标x、y坐标的元组。
2.2 点击鼠标
- 鼠标点击,就调用 pyautogui.click()方法。默认 情况下,点击将使用鼠标左键,点击发生在鼠标当前所在位置。
- 可以传入x、y坐标作为可选的第一第二参数, 点击做标为x, y处。
- 如果想指定鼠标按键,就加入button关键字参数,值分别为'left'、'middle'或'right'。例如,pyautogui.click(100, 150, button='left')
- 实现点击也可以调用pyautogui.mouseDown(),这只是按下鼠标按键,再调用pyautogui.mouseUp(),这只是释放鼠标按键。这些函数的参数与click()相同。实际上,click()函数只是这两个函数调用的方便封装。
- 为了进一步方便,pyautogui.doubleClick()函数只 执行 双击鼠标左键。pyautogui.rightClick()和pyautogui.middleClick()函数将分别执行双击右键和双击中键。
2.3 拖动鼠标
PyAutoGUI提供了pyautogui.dragTo()和pyautogui.dragRel()函数,将鼠标拖动到一个新的位置,或相对当前位置的位置。
# 拖动到x, y 坐标处,用时0.25s
pyautogui.dragTo(x, y, duration=0.25)
# 相对于当前位置拖动鼠标,x、y可以为负数
pyautogui.moveRel(x, y, duration=0.25)
2.4 滚动鼠标
pyautogui.scroll(d)。 传入一个整型,向上或向下滚动 d单位。单位的意义在每个操作系统和应用上不一样, 所以 必须试验,看看在当前情况下滚动多远。滚动发生在鼠标的当前位置。传递正整数表示向上滚动,传递负整数表示向下滚动。
3 处理屏幕
pyautogui有屏幕快照的功能,可以根据当前屏幕的内容创建图形文件。这些函数也可以返回一个Pillow的Image对象,包含当前屏幕的内容。
3.1 获取屏幕快照
调用pyautogui.screenshot()可以获取屏幕快照。
import pyautogui
img = pyautogui.screenshot()
img是屏幕快照的Image对象,img是完全不透明的,这就是让程序"看到"屏幕的方法。
3.2 分析屏幕快照
假设程序中有一步是点击灰色按钮,那么在调用click()方法之前可以进行校验,查看要点击处的像素,如果颜色和灰色按钮不一致,那么就可以知道程序出问题了。
匹配颜色:PyAutoGUI的pixelMatchesColor(x, y, (r,g,b))可以对颜色进行匹配,如果颜色一致返回true。第三个参数(r,g,b)必须是RGB颜色元组,并且颜色完全匹配才会返回True。
4 图像识别
PyAutoGUI可以同过屏幕某一部分的截图去找它在屏幕中的坐标:
>>>import pyautogui
>>>pyautogui.locateOnScreen('submit.png')
(643,745,70,29)
locateOnScreen()函数返回4个整数的元组,是屏幕上首次发现该图像时左边的x坐标、顶边的y坐标、宽度以及高度。如果屏幕上找不到该图像,locateOnScreen()函数将返回None。要成功识别屏幕上的图像必须与提供的图像完全匹配。即使只差一个像素,locateOnScreen()函数也会返回None。
如果该图像在屏幕上能够找到多处,locateAllOnScreen()函数将返回一个Generator对象。可以将它传递给list(),返回一个4整数元组的列表。(locationList=list(generator))。
5 控制键盘
5.1 输入字符串
pyautogui.typewrite()函数向计算机发送虚拟按键。这些按键产生什么效果,取决于当前获得焦点的窗口和文本输入框。(可能需要先向文本输入框发送一次鼠标点击,确保它获得焦点。)
例如:
>>> pyautogui.click( 100, 100); pyautogui.typewrite('Hello world!')
# 同一行中有两条指令用分号隔开
默认情况下,typewrite()函数将立即打印出完整字符串。可以传入可选的第二参数,在每个字符之间添加短时间暂停。
例如,pyautogui.typewrite('Helloworld!',0.25)将在打出H后等待1/4秒。打出e以后再等待1/4秒。这种渐进的打字机效果,对于较慢的应用可能有用,它们处理击键的速度不够快,跟不上pyautogui。
对于A或!这样的字符,pyautogui将自动模拟按住Shift键。
5.2 使用特殊按键(enter、shift等等)
不是所有的键都很容易用单个文本字符来表示。例如把Shift键或左箭头键,那么这些特殊键如何使用呢?
在PyAutoGUI中,这些键表示为短的字符串值:'esc'表示Esc键,'enter'表示Enter。
除了单个字符串参数,还可以向typewrite()函数传递这些键字符串的列表。例如,以下的调用表示按a键,然后是b键,然后是左箭头两次,最后是X和Y键:
>>>pyautogui.typewrite(['a','b','left','left','X','Y'])
因为按下左箭头将移动键盘光标,所以这会输出XYab。
PyKeyboard 属性
键盘键 | 含义 |
---|---|
'a','b','c','A','B','C','1','2','3','!','@','#',等等 | 单个字符的键 |
'enter'(or'return'or'\n')回车键 | 'esc'Esc键 |
'shiftleft','shiftright' | 左右Shift键 |
'altleft','altright' | 左右Alt键 |
'ctrlleft','ctrlright' | 左右Ctrl键 |
'tab'(or'\t') | Tab键 |
'backspace','delete' | Backspace和Delete键 |
'pageup','pagedown' | PageUp和PageDown键 |
'home','end' | Home和End键 |
'up','down','left','right' | 上下左右箭头键 |
'f1','f2','f3',等等 | F1至F12键 |
'volumemute','volumedown','volumeup' | 静音、减小音量、放大音量键(有些键盘没有这些键,但你的操作系统仍能理解这些模拟的按键) |
'pause' | Pause键 |
'capslock','numlock','scrolllock' | CapsLock,NumLock和ScrollLock键 |
'insert' | Ins或Insert键 |
'printscreen' | Prtsc或PrintScreen键 |
'winleft','winright' | 左右Win键(在Windows上) |
'command' | Command键(在OSX上) |
'option' | Option键(在OSX上) |
5.3 按下和释放键盘
就像mouseDown()和mouseUp()函数一样,pyautogui.keyDown()和pyautogui.keyUp()将向计算发送虚拟的按键和释放。它们将根据参数发送键字符串。方便起见,pyautogui提供了pyautogui.press()函数,它调用这两个函数,模拟完整的击键。
5.4 热键组合
例如,对于Ctrl-C,pyautogui.hotkey('ctrl', 'c')
对于Ctrl-Alt-Shift-S 热键组合显示 Style(样式)窗口。 只要调用hotkey('ctrl', 'alt', 'shift', 's')。
小结
本章介绍了许多不同函数,下面是快速的汇总参考:
moveTo(x,y)将鼠标移动到指定的x、y坐标。
moveRel(xOffset,yOffset)相对于当前位置移动鼠标。
dragTo(x,y)按下左键移动鼠标。
dragRel(xOffset,yOffset)按下左键,相对于当前位置移动鼠标。
click(x,y,button)模拟点击(默认是左键)。rightClick()模拟右键点击。
middleClick()模拟中键点击。
doubleClick()模拟左键双击。
mouseDown(x,y,button)模拟在x、y处按下指定鼠标按键。
mouseUp(x,y,button)模拟在x、y处释放指定键。
scroll(units)模拟滚动滚轮。正参数表示向上滚动,负参数表示向下滚动。
typewrite(message)键入给定消息字符串中的字符。
typewrite([key1,key2,key3])键入给定键字符串。
press(key)按下并释放给定键。
keyDown(key)模拟按下给定键。
keyUp(key)模拟释放给定键。
hotkey([key1,key2,key3])模拟按顺序按下给定键字符串,然后以相反的顺序释放。
screenshot()返回屏幕快照的Image对象。