前面我们已经完成了 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 自动化的核心地基,所有复杂自动化脚本都基于以上操作延伸:

  1. 程序操作:start() 启动新程序、connect() 连接已有程序;

  2. 窗口定位:优先使用 window() 多参数匹配,拒绝动态简写;

  3. 窗口操作:支持最大化/最小化/状态判断等全场景操作;

  4. 控件认知:熟记主流控件类型,看懂UISpy控件属性;

  5. 控件定位:print_control_identifiers() 调试 + child_window() 精准定位,解决重复控件问题

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐