Python UI自动化实战教程:四步搞定Windows记事本与计算器自动化
【免费下载链接】Python-UIAutomation-for-Windows🐍Python 3 wrapper of Microsoft UIAutomation. Support UIAutomation for MFC, WindowsForm, WPF, Modern UI(Metro UI), Qt, IE, Firefox, Chrome ...项目地址: https://gitcode.com/gh_mirrors/py/Python-UIAutomation-for-Windows
你有没有反复开过记事本、输入同样的内容、再保存一遍?这类重复劳动正是Windows桌面自动化的用武之地,而Python UI自动化库uiautomation就是干这个的:几行代码就能定位并操作任意Windows应用里的控件。整条上手路线会用记事本和计算器两个应用带你一步步跑通。
📦 一条命令装好uiautomation,顺手拿到控件调试器
安装只需要一条命令:
pip install uiautomation # 想直接运行 demos/ 下的示例脚本,先把仓库克隆下来 git clone https://gitcode.com/gh_mirrors/py/Python-UIAutomation-for-Windows装完后C:\PythonXX\Scripts\里会多出一个 automation.py 脚本,它相当于一个控件调试器:automation.py -h查看全部参数,automation.py -t 0 -n则把当前活动窗口的控件连同属性、支持的模式一并打印出来。写脚本前用它确认一下目标控件长什么样,能省掉很多试错时间。有个版本坑要避开:Python 3.7.6 和 3.8.1 上 comtypes 存在兼容问题,建议直接用最新稳定版。
🎯 三行代码定位控件:先搞懂控件定位
uiautomation 的底层是微软的 UIAutomation:屏幕上每个窗口都是控件树里的一棵子树,你要做的第一件事,就是从这棵树里把想操作的控件找出来。缩小范围的常见手段有:按控件类型选(WindowControl、EditControl、ButtonControl 等)、按属性匹配(Name、ClassName、AutomationId)、正则匹配窗口标题(RegexName),以及最自由的Compare=lambda自定义判断函数。两个参数值得记住:searchDepth=1表示只翻这一层树,定位更快;searchFromControl把搜索范围限定在某个控件内部。
找到控件后,操作靠"模式(Pattern)"完成——每种控件类型能做的事是固定的:按钮支持 InvokePattern(就是点一下触发),编辑框支持 ValuePattern(直接读写文本),窗口支持 WindowPattern(关闭、最小化)。各控件类型与模式的对应关系可以参考这张表:
以找到记事本的编辑框并写入文本为例,三行就够:
window = auto.WindowControl(searchDepth=1, ClassName='Notepad', RegexName='.* - 记事本') edit = auto.EditControl(searchFromControl=window) edit.GetValuePattern().SetValue('hi 你好')第一行只在桌面顶层窗口里找记事本(英文系统标题换成.* - Notepad,示例脚本会按系统语言自动选择),第二行把范围缩进窗口内部取编辑框,第三行通过 ValuePattern 写文本。如果控件还没出现,用auto.WaitForExist(window, 3)等它三秒内出现;WaitForDisappear则用来等窗口关闭,这对判断"操作是否生效"很实用。
📝 实战·记事本自动化脚本:从启动到智能关闭
完整的记事本自动化脚本在 demos/automation_notepad.py 里,主线就是按顺序做四件事:启动应用、找到窗口、往编辑框写内容,再做一些菜单、截图、关闭的进阶动作。
subprocess.Popen('notepad.exe', shell=True) window = auto.WindowControl(searchDepth=1, ClassName='Notepad', RegexName='.* - 记事本') window.SetActive() edit = auto.EditControl(searchFromControl=window) edit.Click(waitTime=0) edit.SendKeys('下面开始演示') window.CaptureToImage('Notepad.png')SendKeys 模拟的是真实键盘输入,支持{Ctrl}a这类组合键和{Enter 3}这种按键次数写法,比 SetValue 更像人手在打字。打完字后window.CaptureToImage('Notepad.png')顺手给窗口截了张图留证。
进阶部分更值得抄进自己的脚本:想改字体,先window.MenuItemControl(Name='格式(O)').Click()打开格式菜单,再点"字体"项,在弹出的字体对话框里用ListItemControl(Name='微软雅黑')选中字体即可;想关闭窗口,window.GetWindowPattern().Close()会触发保存对话框,脚本用window.ButtonControl(Compare=lambda control, depth: '不保存' in control.Name)点击"不保存"按钮——用 lambda 匹配按钮文案,中英文系统下都能点中。
🧮 计算器自动化:按算式自动点按钮
记事本的控件结构跨版本很稳定,计算器却不行:XP 上窗口 ClassName 是SciCalc,Win 7/8 是CalcFrame且按钮靠数字编号识别,Win 10 换成了 Modern UI 窗口、按钮都是英文名。所以 demos/automation_calculator.py 这个示例在入口处先读系统版本,进入对应分支:
osVersion = sys.getwindowsversion().major if osVersion < 6: CalcOnXP() elif osVersion == 6: CalcOnWindows7And8() elif osVersion >= 10: CalcOnWindows10()三个分支各自完成"找到计算器窗口、把按钮收进一张 字符→按钮 的映射表",之后计算逻辑就收敛到同一个 Calc 函数里:把算式去掉空格,逐字符取出对应按钮点击,最后用{Ctrl}c把结果显示框的内容复制到剪贴板,再用auto.GetClipboardText()读出来。也就是说,计算器自动化本质上是"把算式翻译成按钮点击"——映射表建好之后,同一套代码可以跑任意表达式。
🛠️ 脚本出错速查表
| 症状 | 处理方式 |
|---|---|
| 列不出控件、属性读不到 | 以管理员身份运行 Python(Win 7 及以上尤其注意) |
| 控件找不到 | 控件属性可能已变化,用automation.py -t 0 -n重新识别活动窗口的控件 |
| 卡住、响应超时 | 调大TIME_OUT_SECOND全局超时,或调用SetGlobalSearchTimeout设置 |
| 定位偏移、截图错位 | 显示器 DPI 设为 100%;Win10 x64 且 DPI 非 100% 时必须用 64 位 Python |
⚙️ 让脚本更稳,并扩展到更多应用
稳定性上建议把握三点。定位和操作包在 try/except 里,捕获auto.ControlNotFoundError后回退到更大的搜索范围(比如把searchFromControl换成更大的searchDepth),避免一个控件没找到整个脚本崩掉。搜索范围能限就限:searchDepth定得越小,树走得越少;找过的控件存进变量复用,不要每次操作都重新遍历。waitTime控制两个动作之间的停顿,批量快速操作时压到 0.05 甚至 0,慢应用再放宽。
写法打通之后,同样的定位方式能套到别的 Windows 应用上。办公自动化场景里,可以用它读取和写入 Word 文档正文;GitHub Desktop 这类第三方应用只要实现了 UIAutomation Provider(Qt、Electron、WPF 等都算),定位方法原样可用:
批量文件处理则是把文件系统操作和 UI 操作拼在一起,能做出批量重命名、内容提取之类的任务;demos/pretty_print_dir.py 就是同一思路的练习:用树遍历把整个目录结构渲染成文本。
继续深入:示例库与API文档
想多玩几个场景,直接翻 demos/ 目录:记事本与计算器是两个主案例;demos/automation_devicemanager.py 演示遍历并展开设备管理器整棵设备树;demos/clipboard_test.py 和 demos/hotkey_test.py 覆盖剪贴板与热键;demos/get_qq_group_members.py 展示了从一个真实 IM 应用里收集群成员资料。API 细节看官方API文档,2.0 与旧版的接口差异记录在 API changes,更完整的中文介绍在 readme_cn.md。这些就是继续学习 uiautomation 教程的入口。
跑完记事本和计算器之后,骨架已经在了:定位控件、按模式操作、等待并确认结果。下一步只是把目标应用换掉——找到它的窗口,用 automation.py 确认控件属性,再把上面的代码逐行替换。先从简单应用起步,比一上来就追复杂场景更稳,脚本也会越写越顺。
【免费下载链接】Python-UIAutomation-for-Windows🐍Python 3 wrapper of Microsoft UIAutomation. Support UIAutomation for MFC, WindowsForm, WPF, Modern UI(Metro UI), Qt, IE, Firefox, Chrome ...项目地址: https://gitcode.com/gh_mirrors/py/Python-UIAutomation-for-Windows
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考