4:程序启停、窗口定位、控件定位
控件标题、auto_id 为空,无法精准匹配多个同类型控件无索引区分,导致匹配模糊窗口未加载完成,未添加wait()等待方法本篇是 Pywinauto GUI 自动化的核心地基,所有复杂自动化脚本都基于以上操作延伸:start()启动新程序、connect()连接已有程序;窗口定位:优先使用window()多参数匹配,拒绝动态简写;窗口操作:支持最大化/最小化/状态判断等全场景操作;控件认知:熟记
前面我们已经完成了 Pywinauto 环境搭建、UI元素定位工具使用,也跑通了第一个记事本自动化入门脚本。
本篇我将带大家吃透 Pywinauto 核心基础操作,包含:应用程序启动与连接、多种窗口定位方式、窗口状态操作、桌面控件分类、精细化控件定位。所有知识点搭配可直接运行的代码示例,零基础也能彻底掌握,为后续复杂自动化实战打好根基。
一、应用程序的启动与连接
Pywinauto 操作桌面程序,第一步只有两种场景:启动新程序、连接已打开的程序,两种方式适配不同自动化需求。
1.1 start() 启动全新应用程序
适用于自动化脚本从头拉起程序的场景,通过可执行文件路径启动软件,支持系统自带程序、第三方桌面程序。
核心参数:cmd_line,必填项,为程序启动命令/文件路径,支持相对路径、绝对路径。
常用示例:
from pywinauto import Application
# 1. 启动系统自带记事本(简写,系统可识别)
app1 = Application(backend="uia").start("notepad.exe")
# 2. 通过绝对路径启动记事本
app2 = Application(backend="uia").start("C:\\Windows\\system32\\notepad.exe")
# 3. 启动系统计算器
app3 = Application(backend="uia").start("calc.exe")
# 4. 启动第三方软件(Sublime Text,替换为自己的软件路径即可)
app4 = Application(backend="uia").start("D:\software\Sublime Text 3\sublime_text.exe")
1.2 connect() 连接已打开的应用程序
适用于程序已手动打开、或脚本复用已有进程的场景,无需重复启动程序,通过进程ID、窗口句柄精准连接。
核心参数(二选一,仅用一个即可):
-
process:程序进程PID,任务管理器和uispy可查看 -
handle:窗口唯一句柄

from pywinauto import Application
# 方式1:通过PID连接已打开的程序(PID以实际任务管理器为准)
app = Application(backend="uia").connect(process=31528)
# 方式2:通过窗口句柄连接
app = Application(backend="uia").connect(handle=65552)
小技巧:启动程序后,可通过app.process 直接获取当前程序PID,无需手动查询。
二、多种窗口定位方式(核心必会)
成功连接程序后,第二步就是定位窗口。窗口是所有控件的容器,只有定位到窗口,才能操作内部按钮、输入框等元素。Pywinauto 提供多种灵活的窗口定位API,适配不同场景。
2.1 标准 window() 方法(推荐)
支持多参数组合定位,精准度高、稳定性强,是项目开发首选。核心参数如下:
-
title:窗口标题精确匹配 -
title_re:窗口标题正则模糊匹配 -
best_match:标题相似度模糊匹配 -
class_name:窗口类名精确匹配 -
class_name_re:窗口类名正则匹配
Sublime Text 实战示例:
from pywinauto import Application
# 启动程序
app = Application(backend='uia').start("D:\software\Sublime Text 3\sublime_text.exe")
# 1. title 精确匹配
win1 = app.window(title="untitled • - Sublime Text (UNREGISTERED)")
# 2. title_re 正则模糊匹配(包含Sublime Text即可)
win2 = app.window(title_re=".*Sublime Text.*")
# 3. best_match 相似度匹配
win3 = app.window(best_match="untitled • - Sublime Text")
# 4. class_name 类名匹配
win4 = app.window(class_name="PX_WINDOW_CLASS")
# 打印窗口所有控件信息(调试神器)
win2.print_control_identifiers()
2.2 动态解析定位(不推荐)
Pywinauto 支持直接通过 app.控件名 动态匹配窗口,写法简洁但兼容性差。如果窗口标题包含空格、特殊符号,会直接报错,仅适合临时调试。
# 简写方式,等价于 best_match 匹配
win = app.Dialog
# 特殊标题适配:字典取值方式(解决空格、特殊符号问题)
win = app['untitled • - Sublime Text (UNREGISTERED)']
2.3 top_window() 快速获取顶层窗口
一键获取程序顶层窗口,写法极简,但稳定性一般,无法保证匹配目标窗口,仅适合简单场景临时使用。
from pywinauto import Application
app = Application(backend="uia").connect(process=10140)
win = app.top_window()
win.wait('exists') # 等待窗口加载完成
win.print_control_identifiers()
三、常用窗口状态操作
定位窗口后,可对窗口进行最大化、最小化、还原、关闭等常规操作,同时支持获取窗口状态,适配各类自动化场景。
3.1 窗口操作方法汇总
|
方法 |
功能描述 |
返回值 |
|---|---|---|
|
close() |
关闭窗口 |
无 |
|
maximize() |
窗口最大化 |
无 |
|
minimize() |
窗口最小化 |
无 |
|
restore() |
恢复窗口原始大小 |
无 |
|
get_show_state() |
获取窗口状态 |
0=正常、1=最大化、2=最小化 |
|
is_maximized() |
判断是否最大化 |
布尔值 |
|
is_minimized() |
判断是否最小化 |
布尔值 |
|
is_normal() |
判断是否为正常状态 |
布尔值 |
|
is_dialog() |
判断是否为顶级弹窗窗口 |
布尔值 |
3.2 完整实操示例
from pywinauto import Application
# 连接程序、定位窗口
app = Application(backend='uia').connect(process=24600)
win = app.window(title_re='.*Sublime Text.*')
win.wait('exists')
# 窗口状态操作与判断
win.minimize()
print("是否最小化:", win.is_minimized())
win.maximize()
print("是否最大化:", win.is_maximized())
win.restore()
print("是否正常状态:", win.is_normal())
print("窗口状态码:", win.get_show_state())
print("是否为顶级窗口:", win.is_dialog())
# 关闭窗口
win.close()
四、桌面控件分类
窗口内部所有可交互元素都是控件,想要精准操作控件,首先要认识控件类型。我们可通过 UISpy 的 ControlType 识别控件,常见分类如下:
4.1 常用控件大全
-
窗口对话框类:Dialog(对话框)、Pane(窗格),作为容器承载其他控件
-
输入交互类:Button(按钮)、Edit(输入框)、ComboBox(下拉框)、ListBox(列表框)
-
菜单导航类:Menu(菜单栏)、MenuItem(菜单项)、PopupMenu(右键弹窗)、TabControl(选项卡)、TreeView(树状菜单)
-
选择类:CheckBox(复选框)、RadioButton(单选框)
-
展示类:Static(静态文本)、StatusBar(状态栏)、GroupBox(分组框)
所有GUI自动化操作,本质都是对以上控件的点击、输入、选择、取值操作。
五、精细化控件定位实战
窗口定位完成后,核心就是定位子控件。推荐使用 print_control_identifiers() 先打印所有控件信息,再通过 child_window() 精准定位目标控件,适配99%的复杂场景。
5.1 核心方法:child_window()
专门用于定位窗口内的子控件,支持多参数精准过滤,核心拓展参数:
-
control_type:控件类型(Button/Edit/MenuBar等) -
auto_id:控件自动化唯一ID(最稳定定位依据) -
found_index:同类型控件索引,解决控件重复问题
5.2 基础控件定位示例
先打印控件信息
from pywinauto import Application
# 连接程序、定位主窗口
app = Application(backend='uia').connect(process=21992)
win = app.window(title_re='.*Sublime Text.*')
# 打印控件信息
win.print_control_identifiers()
将打印好的控件信息放入文本管理器中

uispy查看关键控件信息 ,通过标题、auto_id、控件类型精准定位菜单栏

回到文本管理器

使用child_window定位子控件
from pywinauto import Application
# 连接程序、定位主窗口
app = Application(backend='uia').connect(process=21992)
win = app.window(title_re='.*Sublime Text.*')
# # 打印控件信息
# win.print_control_identifiers()
# 通过标题、auto_id、控件类型精准定位菜单栏
menu = win.child_window(title="应用程序", auto_id="MenuBar", control_type="MenuBar")
# 打印菜单所有子项
print(menu.items())
5.3 重复控件定位(found_index 解决冲突)
当多个控件 auto_id、类型一致时,直接定位会报错,通过索引 found_index 指定目标控件(下标从0开始):
from pywinauto import Application
app = Application(backend='uia').connect(process=38544)
win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
# 匹配第二个 MenuBar 控件
menu = win.child_window(auto_id="MenuBar", control_type="MenuBar", found_index=1)
print(menu.texts())
5.4 控件层级操作小技巧
-
控件.children():获取当前控件的所有子控件,梳理层级关系 -
控件.parent():获取当前控件的父容器控件
5.5 常见定位失败避坑总结
-
控件标题、auto_id 为空,无法精准匹配
-
多个同类型控件无索引区分,导致匹配模糊
-
窗口未加载完成,未添加
wait()等待方法
六、全文总结
本篇是 Pywinauto GUI 自动化的核心地基,所有复杂自动化脚本都基于以上操作延伸:
-
程序操作:
start()启动新程序、connect()连接已有程序; -
窗口定位:优先使用
window()多参数匹配,拒绝动态简写; -
窗口操作:支持最大化/最小化/状态判断等全场景操作;
-
控件认知:熟记主流控件类型,看懂UISpy控件属性;
-
控件定位:
print_control_identifiers()调试 +child_window()精准定位,解决重复控件问题
更多推荐


所有评论(0)