Python自动操作神器PyAutoGUI的使用教程


Posted in Python onJune 16, 2022

我们以前讲过怎样使用 Python 在浏览器中实现页面自动化操作,不管用哪种方式实现,都是通过定位页面中的元素来进行相应的操作。

今天我们来聊一聊如何在桌面实现自动化操作。与浏览器页面自动化操作类似,桌面自动化操作也是需要定位鼠标在桌面的位置,然后根据定位的位置执行对应的操作。

GUI 控制神器

我们今天的主人公是 pyautogui,pyautogui 是一个纯 Python 的 GUI 自动化工具,通过它可以让程序自动控制鼠标和键盘的一系列操作来达到自动化测试的目的。

这个模块的安装也是老一套:

pip3 install pyautogui

安装好了就可以直接使用了。

鼠标操作

鼠标移动

桌面操作最基本的就是鼠标操作了,我们可以控制鼠标的移动:

# 移动鼠标
pyautogui.moveTo(200,400,duration=2)
pyautogui.moveRel(200,500,duration=2)

整个桌面是以左上角为坐标轴的原点,所有的操作都以这个原点,来确定操作位置。

第一行是将鼠标移动到指定的像素(200,400)位置,第二行代码是将鼠标按照当前点向右移动200px,向下移动400px这个方向移动。

两行代码中都有一个共同的参数 duration,这个参数表示移动时间,即在指定时间内完成移动操作,单位是秒。

运行这两行代码,观察屏幕鼠标的变化,是不是很神奇?

我们还可以获取鼠标位置:

print(pyautogui.position())  

这个很好理解,就是获取鼠标在当前屏幕中的坐标位置,运行这行代码,我们会得到诸如下面的信息:

Point(x=400, y=900)

鼠标点击

通常,我们的鼠标有左右两个按键,高级点的鼠标中间还有个按键。

我的鼠标只有两个按键,中间没有按键,唉~

pyautogui针对这三个按键操作都有相应的处理:

# 鼠标点击,默认左键
pyautogui.click(100,100)   
# 单击左键
pyautogui.click(100,100,button='left')  
# 单击右键
pyautogui.click(100,300,button='right') 
# 单击中间 
pyautogui.click(100,300,button='middle')  

鼠标点击,如果不指定 button 参数,默认是点击左键,前面两个参数就是点击坐标的位置。

运行这段代码,看看你的桌面会发生什么?

鼠标除了点击操作,还有双击操作:

# 双击左键
pyautogui.doubleClick(10,10)  
# 双击右键
pyautogui.rightClick(10,10)   
# 双击中键
pyautogui.middleClick(10,10) 

操作函数也很简单,相信大家一眼就能看明白,如果一眼看不明白,请多看几眼!

熟悉前端的小伙伴可能会马上联想到,鼠标操作有按下和释放的过程,我们屏幕操作也有对应的控制:

# 鼠标按下
pyautogui.mouseDown()   
# 鼠标释放
pyautogui.mouseUp()    

鼠标拖动

我们可以控制鼠标拖动到指定坐标位置,并且设置操作时间:

pyautogui.dragTo(100,300,duration=1)   

这个运行效果和前面移动类似。

根据前面移动的经验,我们也有按照方向拖动鼠标:

pyautogui.dragRel(100,300,duration=4) 

鼠标滚动

在桌面操作中,我们有时候需要滚动鼠标到达向上或者向下的位置,这时候我们可以使用 scroll 这个函数来控制:

pyautogui.scroll(30000) 

参数是整数,表示向上或向下滚动多少个单位,这个单位根据不同的操作系统可能不一样。如果向上滚动,传入正整数,向下滚动传入负整数。

屏幕处理

获取屏幕截图

我们先来假设一个场景:我现在要在屏幕上找到一个红色的点,你会怎么做?通常的做法是拿到这个红色点的颜色值,然后再对屏幕上的点逐个进行比较,直到找到为止。

pyautogui 为我们这个操作场景提供了支持,分别有三个函数可以完成这三件事情。

im = pyautogui.screenshot()
im.save('screenshot.png')
rgb = im.getpixel((100, 500))
print(rgb)
match = pyautogui.pixelMatchesColor(500,500,(12,120,400))
print(match)

第一个是获取屏幕截图函数,它可以返回一个 Pillow 的 image 对象; 第二个是获取屏幕截图中指定坐标点的颜色,返回 rgb 颜色值;第三个是将指定坐标点的颜色和目标的颜色进行比对,返回布尔值。

我们再来升级一下需求:

我现在要在屏幕上找到 edge 浏览器的图标,你会怎么做?

通常的做法是先知道 edge 浏览器的图标长啥样,是绿色还是蓝色,是胖的还是瘦的,对吧?然后再在屏幕上去进行图标的匹配,直到找到一个图标跟我们目标图标一样,就得到了结果。

于是,我们的代码如下:

# 图像识别(一个)
oneLocation = pyautogui.locateOnScreen('1.png')
print(oneLocation)  

# 图像识别(多个)
allLocation = pyautogui.locateAllOnScreen('1.png')
print(list(allLocation))

你可以在桌面上将某个应用的图标截取下来,保存为图片,然后使用上面几行代码来识别,识别成功,你会返回类似下面的结果:

Box(left=20, top=89, width=33, height=34)
[Box(left=20, top=89, width=33, height=34)]

这就是图片在桌面的位置,如果找不到图片,就会返回 None。

键盘输入

键盘函数

键盘输入有下面几个常用的函数:

  • keyDown():模拟按键按下
  • keyUP():模拟按键松开
  • press():模拟一次按键过程,即 keyDown 和 keyUP 的组合
  • typewrite():模拟键盘输出内容

举个例子,大家平时输入感叹号(!)是怎么操作键盘的?

按住 shift 按键,然后再按住 1 按键,就可以了。用 pyautogui 控制就是:

pyautogui.keyDown('shift')    
pyautogui.press('1')    
pyautogui.keyUp('shift')   

运行上面的代码,如果你的鼠标是放在编辑框中,你会得到一个感叹号!

我们还可以直接输出内容:

pyautogui.typewrite('python', 1)

第一个参数是输出的内容,第二个参数是间隔时间,单位是秒。

运行上面代码,你的编辑器里面就会每隔1秒钟按顺序输出 python 的6个字母。

特殊符号

有时我们需要输入键盘的一些特殊的符号按键,比如 换行、方向键等,这些有相对应的键盘字符串表示:

pyautogui.typewrite(['p','y','t','h','o','n','enter'])   

运行上面代码,编辑器里面就会输出 python 之后换行。

其他特殊按键对应的字符串请参考官方说明。

快捷键

如果我要复制一个内容,大部分情况下会使用快键键 ctrl + c,按照上面讲的,我们应该这么实现:

pyautogui.keyDown('ctrl')
pyautogui.keyDown('c')
pyautogui.keyUp('c')
pyautogui.keyUp('ctrl')

这样写起来很麻烦,而且需要掌控按键的按下和释放的顺序。

pyautogui 为我们提供了一个快捷的函数:

pyautogui.hotkey('ctrl','c')

实现的效果和上面的4行代码相同。

信息框

当你在模拟一个桌面操作的时候,如果有分支操作需要根据实际情况来判断,你是不是需要有一个地方可以让你选择走哪个分支?

pyautogui 贴心地考虑到了这种情况,你可以通过弹出一个选择框来中断当前的操作,选择操作分支。

way = pyautogui.confirm('领导,该走哪条路?', buttons=['农村路', '水路', '陆路'])
print(way)

这里就是我们 HTML 页面的 confirm 选择框,选择了选项之后,我们可以获取到选择的选项,然后基于这个选项做判断,进入相应的操作分支。

除了选择确认框之外,还有其他一些提示信息框:

# 警告框
alert = pyautogui.alert(text='警告!敌军来袭!', title='警告框')
print(alert)
# 密码框
password = pyautogui.password('请输入密码')
print(password)
# 普通输入框
input = pyautogui.prompt('请输入指令:')
print(input)

总结

pyautogui 的基本知识就给大家介绍到这里,这个 python 模块的功能十分强大,函数都非常简单,对 python 初学者比较友好。学了这些基本知识之后,你可以运用这些基本知识的组合,去实现一些有趣的桌面自动化操作,快去尝试一把吧!

以上就是Python自动操作神器PyAutoGUI的使用教程的详细内容,更多关于Python PyAutoGUI的资料请关注三水点靠木其它相关文章!


Tags in this post...

Python 相关文章推荐
Python日志模块logging简介
Apr 13 Python
Python中的ceil()方法使用教程
May 14 Python
Python编程中time模块的一些关键用法解析
Jan 19 Python
基于Python的接口测试框架实例
Nov 04 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
python opencv之SURF算法示例
Feb 24 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
python实现登录与注册系统
Nov 30 Python
python内置模块之上下文管理contextlib
Jun 14 #Python
Python时间操作之pytz模块使用详解
Django框架之路由用法
Jun 10 #Python
深入理解pytorch库的dockerfile
Jun 10 #Python
如何利用python实现列表嵌套字典取值
Jun 10 #Python
python中filter,map,reduce的作用
Jun 10 #Python
Django框架中模型的用法
Jun 10 #Python
You might like
php 归并排序 数组交集
2011/05/10 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
Python获取央视节目单的实现代码
2015/07/25 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
python 实现兔子生兔子示例
2019/11/21 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
酒店管理自荐信
2013/10/23 职场文书
军训自我鉴定100字
2014/02/13 职场文书
奉献家乡演讲稿
2014/09/16 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
大学生党性分析材料
2014/12/19 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
python 中yaml文件用法大全
2021/07/04 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL