pyautogui实现UI自动化指南(附项目实战:基于图像识别实现崩坏星穹铁道自动化)

本文主要是介绍pyautogui实现UI自动化指南(附项目实战:基于图像识别实现崩坏星穹铁道自动化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导言

自动化对于很多人来说是一个高深莫测,可望而不可即的概念,但是其实自动化的实现途径有很多,比如接下来笔者将要介绍的就是其中较为简单的实现途径----pyautogui,只要有一定的编程基础,相信你也可以写出自己的自动化脚本,而其它的自动化脚本也可以做到触类旁通。

pyautogui常用函数

1.定位函数locateCenterOnScreen()

定位函数locateCenterOnScreen()可以定位截图在屏幕上的坐标位置。如果你不知道按钮的位置,就不能用moveTo()移动和click()点击。而且按钮的位置可能会变化,这时即使有来坐标也不好用了。

但是如果你有按钮的截图,你就可以调用pyautogui.locateCenterOnScreen()函数来直接获得按钮所在中心坐标如果截图没找到,pyautogui.locateCenterOnScreen()函数返回None。

下面以我的编译器界面为例,在这个界面中,找到星穹铁道的图标:

截图效果是这样:

是不是挺糊的?2333,但是没关系,我们强大的locateCenterOnScreen()函数照样能返回坐标,让我们来试试:

# 导入库
import pyautogui# 寻找截图所在位置
location = pyautogui.locateCenterOnScreen('../automation/template/xing_tie.png')
# 打印截图所在位置
print(location)# 输出结果
# Point(x=1547, y=1563)

1.1 locateCenterOnScreen()可选关键字:匹配精度

虽然掌握了上述内容,你就可以进行基本的定位操作了,但是如果想要更加精确更加高效的完成定位,那么我想下面的可选参数你一定不能错过。

可选的confidence关键字参数指定函数在屏幕上定位图像的精度。该参数越大,图像匹配程度越高。

# 导入库
import pyautogui# 寻找截图所在位置
location = pyautogui.locateCenterOnScreen('../automation/template/xing_tie.png',confidence=0.1)
location1 = pyautogui.locateCenterOnScreen('../automation/template/xing_tie.png',confidence=0.9)
# 打印截图所在位置
print('低精度匹配')
print(location)
print('高精度匹配')
print(location1)# 输出结果
# 低精度匹配
# Point(x=26, y=25)
# 高精度匹配
# Point(x=1547, y=1563)

低精度匹配结果不说严丝合缝,至少也可以说是偏到姥姥家去了,但是很多时候适当调低精度还是有利于定位,因为很多时候截图的清晰度并不是那么高,这时候如果还要求超高精度完美匹配反而定位不到,属于是你这钱给活我也干不了

P.s.需要安装OpenCV库才能使confidence关键字起作用

1.2 locateCenterOnScreen()可选关键字:灰度匹配

在 1920 x 1080 屏幕上,定位函数调用大约需要 1 或 2 秒。这对于大部分项目和程序来说已经绰绰有余,但是对于游戏或者视频来说还是太慢了。可选的grayscale关键字可以给定位函数来稍微加速(大约30%左右)。这会降低图像和屏幕截图的颜色饱和度,从而加快定位速度,但可能会导致误报匹配(假阳性)。

# 导入库
import pyautogui# 寻找截图所在位置
location = pyautogui.locateCenterOnScreen('../automation/template/xing_tie.png',grayscale=True)
# 打印截图所在位置
print(location)# 输出结果
# Point(x=1547, y=1563)

2.鼠标控制函数

2.1鼠标控制函数moveTo( )

鼠标控制函数moveTo( )会将鼠标光标移动至指定坐标(X,Y)None可以传递坐标值来表示“当前鼠标光标位置” 。

# 导入库
import time
import pyautogui# 等待一会方便观察,随后鼠标移动到x:114,y:514的位置
time.sleep(2)
pyautogui.moveTo(114, 514)
# 等待一会方便观察,随后鼠标移动到x不变(114),y:191的位置
time.sleep(2)
pyautogui.moveTo(None,191 )
# 等待一会方便观察,随后鼠标移动到x:981,y不变(191)的位置
time.sleep(2)
pyautogui.moveTo(981, None) 

2.1.1 moveTo( )可选关键字:移动所需时间

通常鼠标光标会立即移动到新坐标。如果您希望鼠标逐渐移动到新位置,请传递第三个参数来表示移动所需的持续时间(以秒为单位)。需要注意的是,如果持续时间小于0.1的话,移动将是即时的。

# 导入库
import pyautogui# 鼠标移动到(114,514)坐标,过程持续3秒
pyautogui.moveTo(114, 514,3)

2.2鼠标控制函数dragTo( )

鼠标控制函数dragTo( )将鼠标在当前位置,按住指定鼠标按键并移动至指定坐标(X,Y),实现拖拽效果。button关键字可以设置为'left'、'middle'、 以及'right'拖动时按住哪个鼠标按钮。

# 导入库
import pyautogui# 将鼠标在当前位置按住鼠标左键并移动至(300,400)坐标
pyautogui.dragTo(100, 200, button='left')
2.2.1 dragTo( )可选关键字:拖拽所需时间

通常鼠标光标会立即拖拽到新坐标。如果您希望鼠标逐渐拖拽到新位置,请传递第三个参数来表示移动所需的持续时间(以秒为单位)。

# 导入库
import pyautogui# 将鼠标在当前位置按住鼠标右键并移动至(300,400)坐标,用时两秒
pyautogui.dragTo(300, 400, 2, button='right')

2.3鼠标控制函数click( )

该click( )函数模拟在鼠标在指定坐标单击指定鼠标按键。“点击”的定义是按下按钮然后松开。button关键字可以设置为'left'、'middle'、 以及'right'以指定点击哪个鼠标按钮。

# 导入库
import pyautogui# 在(114,514)坐标单击鼠标左键
pyautogui.click(114,514,button='left')
2.3.1 click( )可选关键字:点击次数与停顿时间

若要进行多次单击,请将整数传递clicks关键字参数。另外,您可以将浮点数或整数传递给interval关键字参数,以指定单击之间的暂停量(以秒为单位)。

# 导入库
import pyautogui# 在(114,514)坐标单击两次鼠标左键
pyautogui.click(114,514,clicks=2,button='left')
# 在(114,514)坐标单击两次鼠标左键,每次间隔0.25秒
pyautogui.click(114,514,clicks=2, interval=0.25,button='left')

2.4鼠标控制函数scroll( )

鼠标控制函数scroll( )可以通过调用该函数并传递整数次数,在当前坐标模拟鼠标滚轮的滚动操作。每次的滚动量因平台而异。通过传入指定坐标以便在执行滚动之前移动鼠标光标。

# 导入库
import pyautogui# 在当前位置向上滚动10单位量
pyautogui.scroll(10)
# 在(114,514)坐标向下滚动10单位量
pyautogui.scroll(114,514,-10)

3.键盘控制函数

3.1键盘控制函数write( )

键盘控制函数write( )可以模拟键盘输入指定的字符串

# 导入库
import pyautogui# 模拟键盘输入Hello world
pyautogui.write('Hello world!')

3.1.1 write( )可选关键字:输入延迟间隔

若希望在按下每个字符键之间添加延迟间隔,可以为其传入关键字interval

# 导入库
import pyautogui# 模拟键盘输入Hello world,输入两个字符之间的间隔为0.25秒
pyautogui.write('Hello world!', interval=0.25)

 3.2键盘控制函数press( )

键盘控制函数press( )模拟按下一个键然后释放它。需要注意的是,esc,shift这些热键也是可以通过输入字符串进行触发的

# 导入库
import pyautogui# 模拟键盘输入H
pyautogui.press('H')
# 模拟键盘输入热键Enter
pyautogui.press('Enter')

基于图像识别实现星穹铁道自动化项目

该项目基于图像识别技术,实现了刷取副本自动化,由于遗器与角色进阶材料更新较为频繁,且仅仅只是对项目内代码简单复用即可实现补全,因此目前项目只实现了拟造花萼(金),拟造花萼(赤),历战余响的自动刷取,如果该文章浏览量数据理想,评论区大量催更的话,我会尽快完成项目的补全哦~原创不易,还恳请各位多多支持!

# pyautogui库用于自动化鼠标键盘事件
import pyautogui
# 用于控制滚轮事件频率,使其更加自然
import time# 该方法用于获取目标图像所在位置,只要没找到图像就一直找
def get_position(word):up_left = Nonewhile up_left == None:up_left = pyautogui.locateCenterOnScreen('../automation/template/{}.png'.format(word),confidence=0.95)return up_left# 单击
def click(position):pyautogui.click(position[0],position[1],button='left')# 输入刷副本相关参数
type = input('今天想刷啥类型副本')
material = input(f'今天想刷{type}中的哪个副本')
frequency = int(input(f'今天想刷{material}几次呢?'))# 在开始菜单中选择星穹铁道
click(get_position('xing_tie'))
print('星铁已经就绪')# 虽然UI已经出现,但是程序还未准备就绪,需要等待
time.sleep(1)
# 于启动器界面启动游戏
click(get_position('qi_dong'))
print('星穹铁道,启动!')# 于游戏界面开始游戏
click(get_position('start'))
print('创死它!')# 于游戏中点击esc键打开菜单
if get_position('main') != None:pyautogui.hotkey('esc')
print('打开菜单')# 于菜单界面打开指南
click(get_position('guide'))
print('康康指南')if pyautogui.locateCenterOnScreen('../automation/template/today_task.png', grayscale=True) != None:click(get_position('today_task'))# 找到欲拖拽目标type
pyautogui.moveTo(get_position('gloden_flower'))
print('找到预定滚动目标')# 没找到预定目标type就往下滚动列表
while pyautogui.locateCenterOnScreen('../automation/template/{}.png'.format(type),confidence=0.9) == None:pyautogui.scroll(-1)# 慢点滚,看得我眼睛疼time.sleep(0.5)
print('开始滚动')# 金花
if type == 'gloden_flower':click(get_position('gloden_flower'))print('找到预定目标')# 金花_经验if material == 'exp':pyautogui.click(get_position('exp')[0] + 500, get_position('exp')[1] + 100)# 金花_光锥经验elif material == 'weapon_exp':pyautogui.click(get_position('weapon_exp')[0] + 500, get_position('exp')[1] + 100)# 金花_信用点elif material == 'credit_point':pyautogui.click(get_position('credit_point')[0] + 500, get_position('exp')[1] + 100)# 红花
elif type == 'red_flower':click(get_position('red_flower'))print('找到预定目标')# 找到欲拖拽目标materialpyautogui.moveTo(get_position('destory'))print('找到预定滚动目标')# 没找到预定目标material就往下滚动列表while pyautogui.locateCenterOnScreen('../automation/template/{}.png'.format(material), confidence=0.99) == None:pyautogui.scroll(-1)# 慢点滚,看得我眼睛疼time.sleep(0.5)print('开始滚动')# 红花_毁灭if material == 'destroy':pyautogui.click(get_position('destory')[0] + 500, get_position('destory')[1])# 红花_存护elif material == 'preserve':pyautogui.click(get_position('preserve')[0] + 500, get_position('preserve')[1])# 红花_巡猎elif material == 'hunting':pyautogui.click(get_position('hunting')[0] + 500, get_position('hunting')[1])# 红花_丰饶elif material == 'abundance':pyautogui.click(get_position('abundance')[0] + 500, get_position('abundance')[1])# 红花_智识elif material == 'knowledge':pyautogui.click(get_position('knowledge')[0] + 500, get_position('knowledge')[1])# 红花_同谐elif material == 'harmony':pyautogui.click(get_position('harmony')[0] + 500, get_position('harmony')[1])# 红花_虚无elif material == 'nothingness':pyautogui.click(get_position('nothingness')[0] + 500, get_position('nothingness')[1])# 每周副本
elif type == 'weekly_copy':click(get_position('weekly_copy'))print('找到预定目标')# 找到欲拖拽目标materialpyautogui.moveTo(get_position('doomsday_beast'))print('找到预定滚动目标')# 没找到预定目标material就往下滚动列表while pyautogui.locateCenterOnScreen('../automation/template/{}.png'.format(material), confidence=0.99) == None:pyautogui.scroll(-1)# 慢点滚,看得我眼睛疼time.sleep(0.5)print('开始滚动')# 末日兽if material == 'doomsday beast':pyautogui.click(get_position('nothingness')[0] + 500, get_position('nothingness')[1])# 可可利亚if material == 'cocolia':pyautogui.click(get_position('cocolia')[0] + 500, get_position('cocolia')[1])# 幻胧if material == 'hazy':pyautogui.click(get_position('hazy')[0] + 500, get_position('hazy')[1])# 进入战斗
click(get_position('enter_fighting'))# 开始战斗(编队页面)
click(get_position('start_fighting'))# 根据战斗次数决定循环次数
for i in range(frequency-1):# 再打一次click(get_position('fight_again'))

全项目文件

链接:https://pan.baidu.com/s/13tkt10-rVJRzchdnLQZPyw?pwd=1234 
提取码:1234

这篇关于pyautogui实现UI自动化指南(附项目实战:基于图像识别实现崩坏星穹铁道自动化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675991

相关文章

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?