目录
环境
python --version:Python 3.11.8
Pycharm Community:2022.3.3
包的版本
numpy==1.26.4
opencv-python==4.9.0.80
pillow==10.3.0
PyAutoGUI==0.9.54
前置知识
关于屏幕的坐标系,从屏幕的左上角开始为(0,0)坐标
(0,0) X 递增 -->
+---------------------------+
| | Y 递增
| | |
| X * Y screen | |
| | V
| |
| |
+---------------------------+ (X,Y)
鼠标控制函数
屏幕与鼠标位置
size()
获取当前屏幕分辨率的大小,返回一个整型的二元组x,y
import pyautogui
x, y = pyautogui.size() # 当前屏幕分辨率的大小 (x,y)
print("screen_size: ", x, "*", y)
position()
获取当前鼠标的位置,返回一个整型二元组x,y
x, y = pyautogui.position() # 当前鼠标的坐标点 (x,y)
print("screen_size: ", x, "*", y)
OnScreen()
判断一个坐标点是否在屏幕的大小当中,返回一个布尔值
参数:两个整数x,y
check_onScreen = pyautogui.onScreen(12, 56) # 判断坐标点是否在屏幕中
print("check_onScreen: ", check_onScreen)
鼠标移动
当操控光标移动到边界点时(x==0 || y==0)会报错,将FAILSAFE(故障保护)设为False即可关闭报错。详见moveTo()当中,代码行数:1
moveTo()
将鼠标光标移动到一个特定位置
参数:
x,y,[time(sec)]
(time是移动到目标坐标所花费的时间) 如果time小于0.1s,视为0s,立即移动到目标点.
[参数x/y当中可以传递“None”,默认为光标目前的坐标]
pyautogui.FAILSAFE = False # 将故障保护关闭
pyautogui.moveTo(0, 0, 2) # 花费2s移动到0,0
pyautogui.moveTo(500, 500, 0.8) # 花费0.8s移动到500,500
pyautogui.moveTo(None, 0, 0.09) # x不变,花费0.09s移动到当前光标的最上端
pyautogui.moveTo(0, None) # y不变,瞬间移动到当前光标的最左端
move()
以当前光标为中心,分别向x,y移动n个单位像素
参数:
x,y,[time(sec)]
pyautogui.move(50, 0) # 光标向右移动50像素
pyautogui.move(0, 50) # 光标向下移动50像素
pyautogui.move(-25, 0) # 光标向左移动25像素
pyautogui.move(0, -25) # 光标向上移动25像素
pyautogui.move(None, 500) # 光标向下移动500像素
鼠标拖动
dragTo()
按住鼠标左/右/中键,拖动到特定位置
类似于moveTo,不过添加了一项功能
参数:
x,y,[time],[button='left/right/middle']
pyautogui.dragTo(0, 0, button='left') # 按住左键拖动到0,0
pyautogui.dragTo(600, 600, 2, button='right') # 按住左键花费2s拖动到600,600
drag()
以当前光标为原点,在x,y轴方向按住鼠标左/右/中键拖动n个单位像素
类似于move()
参数:
x,y,[time(sec)]
pyautogui.drag(25, 25, 1, button='left')
# 按照左键向右移动25像素,向下移动25像素,共花费2s
mouseDown()按下鼠标
持续按住鼠标左/中/右键进行移动操作(按下后不进行后序mouseUp()操作则不会松开对应键位)
参数:
x,y,button='left/right/middle'
pyautogui.mouseDown(500, 500, button='left')
# 按下左键后移动到500, 500
mouseUp()松开鼠标
移动到某位置后,松开对应键位
参数:
x,y,button='left/right/middle'
pyautogui.mouseUp(0, 0, button='left')
# 移动到0, 0后松开左键
使用mouseDown(),moveTo()和mouseUp()能实现一个dragTo()的效果,其实dragTo()就是这几个方法的便捷方法。
鼠标滚动
scroll()
[移动到x,y坐标后],模拟鼠标的滚轮操作
参数:
clicks,[x,y] (clicks>0向上滑动,clicks<0向下滑动)
pyautogui.scroll(1000, x=100, y=500) # 移动到100,500后向上滑动1000单位clicks
time.sleep(2)
pyautogui.scroll(-500) # 向下滑动500单位
不知道为什么我这里的x,y设置之后好像并不会先移动到对应的位置呢...
键盘控制函数
write()
在光标选中的位置上输入对应的字符。
[因为是模拟键盘的操作,所以只能输入英文哦。中文会自动给忽略掉]
当你在执行write函数的时候,按下shift键也会起到单子切换大写的功能。
参数:
字符串 ,[interval=?] (interval是在每个字符之间的输入间隔,可以给整型或浮点数)
pyautogui.write("hello你好 pyautogui") # 在光标选中位置输入hello pyautogui
pyautogui.write("hello", interval=1) # 在光标转中位置输入hello,单个字符之间间隔1s
press()
模拟用户按下一个键盘上的键后松开。
参数:
key (key要为pyautogui中 KEYBOARD_KEYS的字符)
[key,key,key...] (将要敲下的一串键组合起来,按顺序敲下)
key,[presses=?],[interval=?] (还可以注明同一个键敲下的次数,以及每次敲下的间隔)
pyautogui.press(['n', 'i', 'space', 'h', 'a', 'o', 'space'])
# 切换到中文输入法下模拟来打字哈哈,实际可以使用另一种库来达到输入中文的功能,下面会介绍
pyautogui.press('a', presses=5)
pyautogui.press(['h', 'e', 'l', 'l', 'o']) # 实现一个write()
keyDown()和keyUp()
模拟用户持续按住键,和松开键。
参数:
key (key要为pyautogui中 KEYBOARD_KEYS的字符)
pyautogui.keyDown('ctrl') # 持续按住ctrl键
pyautogui.press('space') # 按一下空格键
pyautogui.keyUp('ctrl') # 松开ctrl键
# 这样就实现了我输入法的转换
press()就是keyDown()和keyUp()的一次搭配使用
hold()上下文管理器
搭配关键字with来使用,完成在持续按下某一键中进行后序操作
参数:
key (key要为pyautogui中 KEYBOARD_KEYS的字符)
with pyautogui.hold('shift'):
pyautogui.press(['a', 'b', 'c'])
# 持续按下shift,直到执行完其中的语句
hotkey()
方便按下键盘上的快捷键
参数:
([key,key,key,...])
pyautogui.hotkey('ctrl', 'shift', 'esc')
# 按下ctrl,shift,esc
# 再松开esc,shift,ctrl
# 把任务管理器喊出来了
消息框函数
alert()警告框
显示一个包含文本和单个“确定”按钮的简单消息框。返回单击的按钮的文本。
alert(text='', title='', button='')返回值为button中的文本
text = pyautogui.alert(text='你好呀', title='消息框', button='ok')
print(text) # 打印ok
confirm()确认框
显示带有“确定”和“取消”按钮的消息框。按钮的数量和文本可以自定义。返回单击的按钮的文本。
confirm(text='', title='', buttons=[])返回选中的按钮文本
text = pyautogui.confirm(text='这是一个确认框', title='confirm',buttons=['yes', 'no'])
print(text) # 返回点击的按钮文本
prompt()输入框
显示一个带有文本输入和“确定”和“取消”按钮的消息框。返回输入的文本,如果单击了“取消”,则返回None
prompt(text='', title='' , default='') # default是输入框中默认文本/提示词点击确认返回输入文本,点击取消返回None
text = pyautogui.prompt(text='输入框', title='prompt', default='随便写点吧')
print(text) # 点击确认返回输入文本,点击取消返回None
password()密码框
显示一个带有文本输入和“确定”和“取消”按钮的消息框。
password(text='', title='', default='', mask='*') # mask是输入文本后进行隐藏并显示的字符返回输入的文本,点击取消则返回None
text = pyautogui.password(text='输入您的密码', title='password', default='输入密码', mask='*')
print(text)
截图功能函数
PyAutoGUI 可以截取屏幕截图,将它们保存到文件中,并在屏幕中定位图像。如果您有一个小图像,例如,需要单击一个按钮并希望在屏幕上找到它,这将非常有用。这些功能由随 PyAutoGUI 一起安装的 PyScreeze 模块提供。
屏幕截图功能需要 Pillow 模块。OS X 使用操作系统附带的命令 screencapture
。Linux 使用该 scrot
命令,可以通过运行 sudo apt-get install scrot
来安装。
相关关键词
- confidence:是置信度,识别屏幕上的精确度,当confidence=0.9时,计算机在识别到有90%相似时认为找到了对应图片 *需要安装opencv才能使用此关键词
- gargyscale:是灰度值,降低屏幕和图片的饱和度,加快匹配速度,但可能会导致误报。
- region:限制了识别搜索的范围
screenshot()截图
调用 screenshot()
将返回一个 Image 对象
参数:
[图片保存路径], [region=(起始x,起始y,向右n个像素,向下n个像素)]
image = pyautogui.screenshot() # 仅返回Image对象 截图默认为全屏
saveImage = pyautogui.screenshot('image.png') # 返回Image对象且保存截图
im = pyautogui.screenshot('image.png', region=(0, 0, 200, 200)) # 截图在(0,0)置长为200,宽为200
定位函数
这些定位函数,被搜索范围都不能被其他东西覆盖哦,要在你肉眼的范围内才能被搜索到。
locateOnScreen()
来获取屏幕坐标。返回值是一个 4 整数元组:(left、top、width、height)
参数:
图片的路径,[confidence=?],[grayscale=False/True],[region=(left、top、width、height)]
location = pyautogui.locateOnWindow('csdn.png')
print(location)
对于返回值可以使用center()函数处理,获取范围的中心点。
center()
获取一个范围内的中心点.
参数:
一个整数四元组
location = pyautogui.locateOnScreen('csdn.png', confidence=0.9)
print(location)
point = pyautogui.center(location)
print(point)
locateCenterOnScreen()
就是一个locatOnScreen()结合了center(),直接返回识别到的区域的中心坐标点
参数:
图片的路径,[confidence=?],[grayscale=False/True],[region=(left、top、width、height)]
location = pyautogui.locateOnScreen('csdn.png', confidence=0.9)
print(location)
point = pyautogui.center(location)
print(point)
point = pyautogui.locateCenterOnScreen('csdn.png', confidence=0.9)
print(point)
其他
locateAllOnScreen()
如果想要抓捕多个与目标图片一致的区域,可以使用这个方法。返回一个生成器,该生成器为图像在屏幕上的位置生成(左、上、宽、高)元组。
参数:
图片的路径,[confidence=?],[grayscale=False/True],[region=(left、top、width、height)]
locate()
在一个范围内寻找目标图片,如果找不到则在整个屏幕中找
参数:
图片的路径,region=(left、top、width、height),[confidence=?],[grayscale=False/True]
locateAll()
与locateAllOnScreen()类似。在一个特定的范围内寻找全部匹配的区域,并返回生成器。