PyWinAuto不使用child_window如何定位DaVinci Resolve编辑框并交互?
解决PyWinAuto定位DaVinci Resolve Studio Template窗口编辑框的问题
问题背景
在操作DaVinci Resolve Studio的Template窗口时,无法通过child_window定位文本编辑框——仅当编辑框已有输入时才会出现child_window相关返回,初始状态下无对应结果。尝试的代码存在语法错误,需要不依赖child_window的控件定位与交互方案。
用户错误代码
from pywinauto.application import Application app = Application(backend="uia").connect(title="DaVinci Resolve Studio - Template") #app.DaVinciResolveStudioTemplate.print_control_identifiers() Title = app.DaVinciResolveStudioTemplate.['TitleEdit', 'Edit8'].wrapper_object() Title.type_keys("Test")
语法错误:
app.DaVinciResolveStudioTemplate.['TitleEdit', 'Edit8']写法违规,属性访问不能在对象后直接跟.加方括号,需调整为正确的控件调用方式。
不依赖child_window的定位方案
以下基于UIA后端(适配DaVinci Resolve的Qt架构)提供几种可行方法:
方法1:通过Automation ID/名称定位
Qt程序的控件通常有固定的automation_id,即使编辑框为空也不会消失,可直接通过该属性定位:
from pywinauto.application import Application # 连接目标窗口 app = Application(backend="uia").connect(title="DaVinci Resolve Studio - Template") template_window = app.window(title="DaVinci Resolve Studio - Template") # 方式A:通过automation_id定位 title_edit = template_window.Edit(automation_id="TitleEdit") # 方式B:通过控件名称定位(若名称不为空) # title_edit = template_window.Edit(name="TitleEdit") # 输入文本 title_edit.type_keys("Test")
方法2:通过控件索引定位
如果知道目标编辑框是同类型控件中的第N个(对应用户代码中的Edit8),可通过索引定位(索引从0开始):
# 第8个编辑框对应索引7 title_edit = template_window.Edit(index=7) title_edit.type_keys("Test")
方法3:遍历控件筛选
若不清楚具体属性,可遍历窗口下所有编辑框,通过属性判断目标控件:
# 遍历所有编辑类型控件 for ctrl in template_window.descendants(control_type="Edit"): # 打印控件属性,便于确认目标 print(f"Automation ID: {ctrl.automation_id()}, 控件名称: {ctrl.name()}") # 匹配目标条件后输入文本 if ctrl.automation_id() == "TitleEdit": ctrl.type_keys("Test") break
关键说明
- 优先使用
automation_id:DaVinci Resolve作为Qt程序,控件的automation_id通常固定且不受编辑框内容影响,是最可靠的定位依据。 - 打印控件信息:取消注释
template_window.print_control_identifiers(),可查看所有控件的完整属性列表,快速找到目标编辑框的标识信息。 - UIA后端适配:必须使用
backend="uia",win32后端对Qt程序的控件支持有限,无法获取完整的控件属性。
内容的提问来源于stack exchange,提问作者PHaRTnONu
相关产品推荐
相关产品推荐

