使用PyAutoGui操作键盘和鼠标

简介

PyAutoGui是一个可以控制鼠标和键盘的python库,当需要完成一些繁琐且重复的工作时,可以使用这个库来帮助完成

安装

1
pip install pyautogui

使用

写在前面

导入

1
import pyautogui

故障安全

如果鼠标位于主监视器的四个角的任意一个时,它将触发pyautogui.FailSafeException,调用每个PyAutoGui函数时,有0.1s的延迟可以将鼠标移动到四个角中的任意一个位置,这个延迟的时间可由pyautogui.PAUSE设置,如果不需要故障保护可以设置pyautogui.FAILSAFE=FALSE

鼠标控制功能

屏幕和鼠标位置

屏幕上的位置由笛卡尔坐标引用,原点位于左上角处,X和Y均是从0开始

1
2
3
4
5
6
7
8
9
0,0       X increases -->
+---------------------------+
| | Y increases
| | |
| 1920 x 1080 screen | |
| | V
| |
| |
+---------------------------+ 1919, 1079

所以1920*1080的屏幕右下角像素为(1919,1079)

1
2
3
4
5
6
7
8
>>> pyautogui.size()#获取屏幕的大小
Size(width=1920, height=1080)
>>> pyautogui.position()#获取鼠标的位置
Point(x=1253, y=604)
>>> pyautogui.onScreen(1111,123)#检测某点是否在屏幕上
True
>>> pyautogui.onScreen(1111,1234)
False

鼠标移动

鼠标移动使用moveTo功能

1
>>>pyautogui.moveTo(100,200,1)#移动到100,200处,移动的时间为1s

如果参数是None,则该处坐标使用之前鼠标的位置

1
>>>pyautogui.moveTo(None,500)#X坐标使用之前鼠标位置的X坐标,Y移动到500

move()函数是将坐标移动到相对之前位置的几个像素上

1
2
>>>pyautogui.moveTo(100,200)#将光标移动到(100,200)
>>>pyautogui.move(0,50)#将光标移动到(100,250)等价于pyautogui.move(None,50)

鼠标拖动

鼠标拖动有函数dragTo()drag(),除此之外还有一个button关键字,用来设置用什么键拖动

1
>>>pyautogui.dragTo(100,200,2,button='left')#将鼠标左键在2s拖动到(100,200)

补间/缓动函数

使用该函数可以让光标在移动过程中的速度发生变化

1
2
3
4
5
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad)     #开始慢,后边快
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad) #开始快,后边慢
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad) #开始和后边慢,中间快
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce) #像皮球在地面反弹一样逐渐移动到终点
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic) #左右震荡到终点

更多参考https://pypi.python.org/pypi/PyTweening

鼠标点击

点击函数为click(),默认为点击左键

1
>>>pyautogui.click(x=100,y=200,button='right',clicks=2,interval=0.25)#点击(100,200)位置处,右键双击,两次按键之间相隔0.25s

此外还有doubleClick()tripleClick(),参数类似。除此之外还有rightClick()函数,参数也类似

mouseDown()和mouseUp()

鼠标按下和松开分别用mouseDown()mouseUp()函数

1
>>> pyautogui.mouseDown(x=200,y=200,button='right')

鼠标滚动

鼠标滚动使用scroll函数

1
>>> pyautogui.scroll(500,x=100,y=200)#光标移动到(100,200)处,页面向上滚500像素

键盘控制功能

write()函数

此函数将键入传递的字符串中的字符,要在每个字符键入时添加延迟间隔可以使用interval参数,这个函数一次只能键入一个字符

1
>>> pyautogui.write("Hello World!",interval=0.25)

press()、keyDown()、keyUp()函数

press()按下一个键然后松开它,keyDown()按住某个键,keyUp()松开某个键

1
2
3
4
5
6
>>> pyautogui.keyDown('shift') #按住shift 
>>> pyautogui.press('left', presses = 3, interval=1)#按下left键3次,每次间隔1秒
>>> pyautogui.press('left')
>>> pyautogui.press('left')
>>> pyautogui.keyUp('shift')
>>> pyautogui.press(['left', 'left', 'left'])#将要输入的键一起放到一个数组中

hold()上下文管理器

1
2
>>> with pyautogui.hold('shift'):
pyautogui.press(['left', 'left', 'left'])

相当于

1
2
3
4
5
>>> pyautogui.keyDown('shift')
>>> pyautogui.press('left')
>>> pyautogui.press('left')
>>> pyautogui.press('left')
>>> pyautogui.keyUp('shift')

hotkey()函数

1
>>> pyautogui.hotkey('ctrl', 'shift', 'esc')

相当于

1
2
3
4
5
6
>>> pyautogui.keyDown('ctrl')
>>> pyautogui.keyDown('shift')
>>> pyautogui.keyDown('esc')
>>> pyautogui.keyUp('esc')
>>> pyautogui.keyUp('shift')
>>> pyautogui.keyUp('ctrl')

关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`',
'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
'browserback', 'browserfavorites', 'browserforward', 'browserhome',
'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
'command', 'option', 'optionleft', 'optionright']

消息框功能

PyAutoGui提供了四种消息框功能

alert()函数

1
>>> pyautogui.alert(button="OK",text="text",title="title")

显示效果:

image-20211001112614755

confirm()函数

1
>>> pyautogui.confirm(text="test",title="title",buttons=['OK','Cancel''none'])#注意这里是buttons,即可以设置多个按键

显示效果:

image-20211001112527494

prompt()函数

1
>>> pyautogui.prompt(text="test",title="title",default="ewrw")

显示效果:

image-20211001112352356

password()函数

1
>>> pyautogui.password(text='test',title='title',default='123',mask='*')

显示效果:

image-20211001112813953

如果按取消则返回None

截图功能

pyautogui的截图功能使用的是pillow模块

截图函数

1
2
3
>>> import pyautogui
>>> im1 = pyautogui.screenshot()
>>> im2 = pyautogui.screenshot('my_screenshot.png')

如果参数传递文件名字符串则将截图保存到文件,并且返回image图像

在1920*1080屏幕上,screenshot函数大约需要100毫秒(实测约36ms)

可以用region来选取截图的范围

1
2
>>> import pyautogui
>>> im = pyautogui.screenshot(region=(0,0, 300, 400))#参数分别起始点坐标和宽,高

定位功能

如果你有要点击窗口的某个位置,但是这个按钮的位置随每次打开窗口都在发生变化。只要你有这个按钮的图像可以通过locateOnScreen()函数查找

1
2
3
4
5
import pyautogui as pag
g = pag.locateOnScreen('test.png')
g = pag.center(g)#求要点击图像的中心位置
pag.doubleClick(g)
pag.click('test.png')#简便写法

如果找不到图像则返回None

可选参数confidence(需安装OpenCV),用于设置因为像素点差异而引起的无法找到图像

1
2
3
>>> import pyautogui
>>> x, y = pyautogui.locateCenterOnScreen('test.png')#该函数结合了locateOnScreen()和center()
>>> pyautogui.click(x, y)

定位功能实际使用大约需要200ms(将PAUSE时间取消)

如果要找到全部图像则使用locateAllOnScreen()函数

1
2
3
4
5
6
7
8
9
10
>>> import pyautogui
>>> for pos in pyautogui.locateAllOnScreen('test.png')
... print(pos)
...
(1101, 252, 50, 50)
(59, 481, 50, 50)
(1395, 640, 50, 50)
(1838, 676, 50, 50)
>>> list(pyautogui.locateAllOnScreen('test.png'))
[(1101, 252, 50, 50), (59, 481, 50, 50), (1395, 640, 50, 50), (1838, 676, 50, 50)]

定位功能非常耗时,最好的方法就是传递一个region参数来限制搜索区域

1
2
>>> import pyautogui
>>> pyautogui.locateOnScreen('test.png', region=(0,0, 300, 400))

灰度匹配

可以传递grayscale=True给locate函数加速(大约30%左右),这会加快定位速度,但可能导致误报匹配

1
2
3
4
>>> import pyautogui
>>> b = pyautogui.locateOnScreen('test.png', grayscale=True)
>>> b
(1416, 562, 50, 41)

像素匹配

要获取屏幕中像素的RGB颜色可以使用getpixel()函数

1
2
3
4
>>> import pyautogui
>>> im = pyautogui.screenshot()
>>> im.getpixel((100, 200))
(130, 135, 144)

或作为单个函数调用pixel()函数,偶尔会报错,不稳定

1
2
3
4
5
6
7
8
>>> import pyautogui
>>> pix = pyautogui.pixel(100, 200)
>>> pix
RGB(red=130, green=135, blue=144)
>>> pix[0]
130
>>> pix.red
130

如果要验证某点像素值与给定像素是否匹配,则可以调用pixelMatchesColor()函数,tolerance为像素值匹配时可以变化的程度。

1
2
3
4
5
6
7
>>> import pyautogui
>>> pyautogui.pixelMatchesColor(100, 200, (130, 135, 144))
True
>>> pyautogui.pixelMatchesColor(100, 200, (140, 125, 134))
False
>>> pyautogui.pixelMatchesColor(100, 200, (140, 125, 134), tolerance=10)
True