一、安装
1.问题百出
python3 -m pip install pyautogui
windows直接就能装0.9.50,而linux上出现了大问题。
问题:最新版0.9.50(2020//07/31)
这个是下载pyscreeze
期间出现了问题。
那就手动下
python3 -m pip install pyscreeze
以此类推,pygetwindow
、PyTweening
、pymsgbox
……
但卡死在pyobjc
和puobjc-core
上。
2.成功
一般都是最新版的包不行,就降低版本安装
python3 -m pip install PyAutoGUI==0.9.33
二、使用
import pyautogui as pg
1.屏幕和鼠标操作
1.1.尺寸
>>> pg.size()
(1920, 1080)
1.2.鼠标位置
>>> pg.position()
(11, 6)
注意:屏幕最左边(x的最小值)是0,屏幕最右边(x的最大值)是1919(pg.position()[0] - 1
)。
1.3.移动鼠标
注意:关于坐标的默认值None
,只是函数这样定义,但我们并不可以传入None值,比如pg.moveTo(None,100)
,pg.moveRel(None,100)
1.3.1.绝对位置和保护措施FailSafeException
def moveRel(xOffset=None, yOffset=None, duration=0.0, tween=linear)
>>> pg.moveTo(100,50)
不用担心越界报错:
- x和y都可以比最大值大,效果是x和y的值是其最大值。
- x和y都可以是负数,效果是x和y的值是0。
而当x和y都是0时,(0, 0)
,会抛出FailSafeException
。
Python移动鼠标、点击键盘非常快,当你想要关闭时,如果鼠标还在自动操作,就很难在程序窗口关闭它。为了能够及时中断,PyAutoGUI提供了一个保护措施FailSafeException
。
- (默认开启)当
pg.FAILSAFE = True
时:
如果把鼠标光标在屏幕左上角(0, 0)
,PyAutoGUI函数就会产生pg.FailSafeException
异常。如果失控了,需要中断PyAutoGUI函数,就把鼠标光标在屏幕左上角。 - 要禁用这个特性,就把FAILSAFE设置成False:
pg.FAILSAFE = False
1.3.2.相对位置
def moveRel(xOffset=None, yOffset=None, duration=0.0, tween=linear)
>>> pg.moveRel(0,100) # x不动,y+=100
>>> pg.moveRel(-100,-100) # x-=100,y+=100
也不用担心越界,自动归0或最大值。
1.3.3.缓慢移动
# 坐标x,坐标y,时间秒,移动方式
>>> pg.moveTo(1800, 500, duration=2, tween=pg.easeInOutQuad)
1.3.4.滑动条
pyautogui.scroll(clicks)
鼠标当前位置滚轮滚动:它只接受一个整数。如果值为正往上滚,值为负往下滚。
>>> pg.scroll(-100) # 向下滚动
1.4.鼠标点击
1.4.1.单击/多次点击
# 左键单击当前位置
>>> pg.click()
# 右键单击当前位置
>>> pg.click(button='right')
>>> pyautogui.rightClick()
# 中键单击当前位置
>>> pyautogui.middleClick()
pg.click(x=None, y=None, clicks=1, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)
x,y
是要点击的位置,默认是鼠标当前位置clicks
是点击次数interval
是间隔时间,秒button
是要点击的按键,有三个可选值:‘left’
,‘middle’
,‘right’
duration
是持续时间tween
是方式
1.4.2.双击
pg.doubleClick(x=None, y=None, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)
# 左键双击当前位置
>>> pg.doubleClick()
1.4.3.三击
pg.tripleClick(x=None, y=None, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)
1.5.拖拽
1.5.1.绝对位置
从当前位置拖拽到绝对位置
pg.dragTo(x=None, y=None, duration=0, button='left', mouseDownUp=True)
- duration:0太快了,可能出现没拉上的效果。起码选个0.5吧。
- mouseDownUp:True拖拽,False同move。
>>> pg.dragTo(x=427, y=535, duration=3)
1.5.2.相对位置
pg.dragTo(xOffset=None, yOffset=None, duration=0, button='left', mouseDownUp=True)
>>> pg.dragRel(100, 100, duration=1)
1.5.3.手动拖拽
pg.mouseDown(x=None, y=None, button='left', duration=0)
pg.mouseUp(x=None, y=None, button='left', duration=0)
pg.mouseDown();
# 鼠标移动到x=2745, y=778位置松开(与mouseDown组合使用选中)
pg.mouseUp(x=2745, y=778, button='left', duration=5)
2.键盘
2.1.打字
2.1.1.文本内容
pg.typewrite('XXX')
# 打字:快速输入
pg.typewrite('Hello world!')
# 打字:内容,打每个字间隔的时间秒
pg.typewrite('Hello world!', interval=0.25)
PS:不能识别中文,会跳过中文。pg.typewrite('你好world!')
的结果是world!
2.1.2.特殊字符
pg.typewrite([''])
:没有特殊意思的无效!
pg.typewrite(['','',...])
:这不是同时的ctrl+shift那种,而是接连的,按完Ctrl松开,再按shift松开。
pg.typewrite(['enter'])
pg.typewrite(['left','enter','left'])
特殊字符
'''
'enter'(或'return' 或 '\n') 回车
'esc' ESC键
'shiftleft', 'shiftright' 左右SHIFT键
'altleft', 'altright' 左右ALT键
'ctrlleft', 'ctrlright' 左右CTRL键
'tab' ('\t') TAB键
'backspace', 'delete' BACKSPACE 、DELETE键
'pageup', 'pagedown' PAGE UP 和 PAGE DOWN键
'home', 'end' HOME 和 END键
'up', 'down', 'left','right' 箭头键
'f1', 'f2', 'f3'…. F1…….F12键
'volumemute', 'volumedown','volumeup' 静音、音量+、音量-
'pause' PAUSE
'capslock', 'numlock','scrolllock' CAPS LOCK, NUM LOCK, 和 SCROLLLOCK 键
'insert' INS或INSERT键
'printscreen' PRTSC 或 PRINT SCREEN键
'winleft', 'winright' Win键
'command' Mac OS X command键
'''
2.2.按键
# 按下抬起
pg.press('esc')
# 连按
pg.press(['left', 'left', 'left', 'left', 'left', 'left'])
# 按下
pg.keyDown('shift')
# 抬起
pg.keyUp('shift')
# 组合键(同时):接收多个字符串参数,顺序按下,再反序释放
pg.hotkey('ctrl', 'c')
e.g.
pyautogui.hotkey('ctrl','c') #按住Ctrl键,然后按C键,然后释放C键和Ctrl键
# 相当于
pyautogui.keyDown('ctrl')
pyautogui.keyDown('c')
pyautogui.keyUp('c')
pyautogui.keyUp('ctrl')
3.控制速度
# float或int时间(秒),为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。
pyautogui.PAUSE = 2.5
4.截图
4.1.全屏和保存
# 还没存储
im1 = pg.screenshot()
# 这才存储
im1.save('my_screenshot.png')
# 直接存储
im2 = pg.screenshot('my_screenshot2.png')
类型是PIL.Image.Image
,可以和matplotlib.pyplot
交互。
import pyautogui as pg
import matplotlib.pyplot as plt
im1 = pg.screenshot()
plt.imshow(im1)
plt.show()
4.2.局部截图
im = pg.screenshot(region=(0, 0, 300 ,400))
4.3.查图
如不存在,则返回None
。实战的时候注意判断是否为None。
4.3.1.区域
pg.locateOnScreen('folder.png')
使用名字orpg.locateOnScreen(im)
使用变量
pg.center(coords)
import pyautogui as pg
# 300,400是偏移量,而不是坐标
im1 = pg.screenshot(region=(0, 0, 300 ,400))
im1.save('folder.png')
# 在当前屏幕中查找指定图片(图片需要由系统截图功能截取的图)
# 结果Box(left=1740, top=360, width=126, height=152)
coords = pg.locateOnScreen('folder.png') # coords = pg.locateOnScreen(im1)
# 获取定位到的图中间点坐标
center = pg.center(coords)
# Point(x=1803, y=436)
4.3.2.中心
pg.locateCenterOnScreen('folder.png')
使用名字orpg.locateCenterOnScreen(im)
使用变量
center = pg.locateCenterOnScreen('folder.png')
# Point(x=1803, y=436)
5.窗口
5.1.alter告示
pg.alert(text=None, title=None)
>>> pg.alert() # 空的
>>> pg.alert('This is an alert box.', 'Test')
特性:阻塞式,点击’确定’后才继续后面的内容
用途:可以用在需要程序敏感的地方(开始程序、确认继续进行之类、防止无限循环)
# 不管点击确定还是点击X关闭,都是返回'OK'
res = pg.alert('This is an alert box.', 'Test')
if res == 'OK':
print('always is OK')
else:
print(res)
5.2.confirm选择
pg.confirm(text=None, title=None, buttons=None)
>>> py.confirm()
# 点击'确定',返回'OK'
# 点击'取消'和X关闭,都返回'Cancel'
>>> py.confirm('Text', 'Title', ['A','B'])
# 点击哪个按钮返回哪个字符串,如A→'A'
# 点击X关闭,返回None(不是空字符串'')
PS:可以用方向机左右来选择,Enter
5.3.prompt明文输入
pg.prompt(text=None, title=None)
>>> pg.prompt()
# 输入什么点击OK就返回什么,空则返回空字符串''
# Cancel和X关闭都是None
>>> pg.prompt('Text', 'Title')
5.4.password密码*
pg.password(text=None, title=None)
>>> pg.password()
# 输入什么点击OK就返回什么,空则返回空字符串''
# Cancel和X关闭都是None
>>> pg.password('Text', 'Title')