pywinauto print_control_identifier()未列出全部控件,无法访问Toolbar子按钮
pywinauto访问TToolBar子按钮解决方案
1. 优先使用win32后端的ToolbarWrapper内置方法
win32模式下TToolBar的子按钮不会被识别为独立控件,因此print_control_identifier()不会列出子按钮,你已经拿到了正确的ToolbarWrapper实例,直接调用其内置方法即可访问按钮:
- 先获取工具栏实例
toolbar = app.EditField.child_window(title="ToolBar", class_name="TToolBar").wrapper_object()
- 按Inspect中查到的
ChildId(对应按钮索引,从0开始计数)访问加号按钮:
# ChildId为0就填0,依次类推 add_button = toolbar.button(0) # 执行点击操作 add_button.click()
- 若不确定按钮索引,可打印所有按钮信息确认:
for btn in toolbar.get_buttons(): print(f"索引:{btn.index}, 按钮文本:{btn.text}, 命令ID:{btn.id}")
2. 若使用uia后端需注意初始化规则
你之前切换uia后端未生效,大概率是没有在应用初始化阶段指定backend参数,正确操作如下:
from pywinauto import Application # 初始化应用时就要指定backend为uia,不可中途切换 app = Application(backend="uia").connect(title_re=".*SICK CDS S100.*") # 逐层匹配窗口避免匹配错误 main_window = app.window(title_re=".*\.scp - SICK CDS S100") second_window = main_window.child_window(title="S100 - S10B9011DA") edit_window = second_window.child_window(title="Edit field") # 访问工具栏及子按钮 toolbar = edit_window.child_window(title="ToolBar", control_type="ToolBar") add_button = toolbar.child_window(control_type="Button", found_index=0) add_button.click()
3. 常见问题排查
- 调用
buttons()报错是因为ToolbarWrapper没有该方法,正确的获取按钮方法为button(索引)、get_button(命令ID) - 直接用
app.EditField可能匹配到错误窗口,建议按实际窗口层级逐层指定父窗口访问
内容的提问来源于stack exchange,提问作者o.sk
相关产品推荐
相关产品推荐

