Python自动操作 GUI 神器——PyAutoGUI
liuian 2025-09-04 11:51 21 浏览
作者:闲欢
来源:Python 技术
我们以前讲过怎样使用 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 初学者比较友好。学了这些基本知识之后,你可以运用这些基本知识的组合,去实现一些有趣的桌面自动化操作,快去尝试一把吧!
相关推荐
- office和visio安装顺序(office和visio怎么一起安装)
-
在某些情况下,安装Visio可能会发生与Office365冲突的问题。这是因为Visio和Office365具有不同的版本,可能会导致安装时出现错误或兼容性问题。为了避免这种冲突,...
- 电脑中病毒的原因(电脑中病毒正常吗)
-
电脑中毒的原因有以下几方面:1.网页被挂病毒。2.电脑裸奔,无防病毒软件。3.执行一些不安全的程序。4.U盘等不安全介质。5.电脑漏洞不及时补,被后台种毒。为了电脑不中病毒要注意以下几方面:1.更新系...
- 手机psd转换成jpg最简单方式
-
可以使用photoshop工具,方法如下:1、首先打开PS软件,然后选择自己需要的JPG格式的图片,在PS中打开。2、接下来先按快捷键“Ctrl+j”将图片复制出来,防止后面操作对原图片有损...
- win7提示激活码过期怎么办(win7激活已过期)
-
以win7为例,出现这样的问题原因分析:电脑的win7系统激活过又重新提示要激活的原因是因为微软对网络上的秘钥进行封杀所以导致我们激活无效。具体的解决方法:1、我们打开dos命令窗口,在创立中输入“s...
- 联想笔记本光驱驱动下载(联想电脑光驱驱动器在哪)
-
开机时进入BIOS,具体按什么牌子不同,按键也不同,开机有提示的,选择启动项,把光驱启动的顺序放到第一.按F10保存,重新启动就是光驱启动啦不需要设置光驱驱动,笔记本自带光驱驱动光驱是电脑的硬件设备,...
- win10装机必备实用软件(win10电脑装机必备软件)
-
1、office大部分的版本如office2007、office2000、office2011、office2013、office2016、office365等都支持win10。2、需要注意...
- 迅雷无法下载的链接用什么下载
-
1.可以使用其他下载工具代替迅雷。2.迅雷可能无法下载的原因有很多,比如网络问题、软件故障等。其他下载工具可以提供类似的功能,但可能具有更好的稳定性和兼容性。3.一些常见的替代迅雷的下载工具包括...
- apple官方网站(apple官方网站旗舰店)
-
1、首先打开浏览器,输入https://www.apple.com/;2、即可浏览苹果官网。 苹果公司(AppleInc.)是美国一家高科技公司。由史蒂夫·乔布斯、斯蒂夫·沃兹尼亚克和罗·韦恩(R...
- 哪些手机用鸿蒙系统(都什么手机能用鸿蒙系统)
-
截至目前,国内有以下几款手机品牌可以装鸿蒙系统:1.华为:华为Mate40系列、P40系列、Mate30系列、MatePadPro系列等。2.荣耀:荣耀V40、荣耀30系列、荣耀X10系列等...
- 手机u盘读不出来了怎么修复(手机u盘读取不出来)
-
1、手机不支持OTG功能,所以将U盘连接到手机后,手机无法识别U盘的内容,因此显示不了;这种情况只能换台支持OTG功能的手机来连接U盘才行。2、手机支持OTG功能,但是使用的OTG线质量有问题导致无法...
- 笔记本散热器买哪种好(笔记本散热器买哪种好贴吧)
-
散热器有十大品牌:九州风神、超频三,酷冷至尊Tt、AVC、思民、捷冷、安钛克Antec、安耐美Enermax、海盗船Corsair。能位列十大品牌,每一种的质量和功能都有保障。、目前网上销量最高的是九...
-
- 打印机驱动一直安装失败(打印机驱动一直安装失败怎么办)
-
打印机驱动程序安装失败需要对电脑进行其他设置,详细步骤如下:1,在电脑桌面上找到【计算机】并用鼠标右击。2,右击后在出现的选项中找到【管理】选项并点击打开。3,接下里会进入到计算机控制台界面,在这里要根据自己的电脑选择64位或者32位,选择...
-
2026-01-14 12:55 liuian
- ctrl加谁是截图(ctrl和什么键可以截图)
-
第一种:Ctrl+PrScrn使用这个组合键截屏,获得的是整个屏幕的图片第二种:Alt+PrScrn这个组合键截屏,获得的结果是当前窗口的图片第三种:打开qq,使用快捷键Ctrl+...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
