You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基础场景下pywinauto的print_control_identifiers()调用失败咨询

pywinauto中print_control_identifiers()的使用问题解析

问题本质

你遇到的三类调用问题,核心是对pywinauto不同类的定位和方法特性不熟悉:

  • Application类:调用print_control_identifiers()报错,因为它是进程管理对象,并非GUI控件包装器,本身没有该方法。
  • DialogWrapper类:调用报错,因为这是win32 backend下的低级窗口包装类,未实现print_control_identifiers()方法。
  • WindowSpecification类:调用返回None,因为该方法默认直接将控件信息打印到控制台,没有返回值,你用logger.debug(f"{...}")捕获的是方法的返回值(即None),实际控件信息已经输出到标准输出了。

解决方案

1. 明确合法调用对象

print_control_identifiers()是GUI控件包装器的专属方法,只能对具体的窗口/控件包装对象调用,不能直接作用于Application对象。

2. DialogWrapper的替代处理

如果已经拿到DialogWrapper对象,可通过两种方式获取控件信息:

  • 直接用对应的WindowSpecification对象调用方法(推荐):
    self.app.window(best_match=expected_window_title).print_control_identifiers()
    
  • 使用dump_tree()方法获取控件信息字符串:
    control_info = self.main_window_dialog.dump_tree()
    logger.debug(control_info)
    

3. 解决WindowSpecification返回None的问题

print_control_identifiers()本身无返回值,仅直接打印内容到控制台。若要将信息记录到日志,改用dump_tree()方法,它会返回包含控件层级和标识符的字符串:

# 方式1:直接打印到控制台(无需捕获返回值)
self.main_window_specification.print_control_identifiers()

# 方式2:获取字符串并写入日志
control_info = self.main_window_specification.dump_tree()
logger.debug("控件标识符信息:\n" + control_info)

代码调整示例

针对你的代码,关键部分修改如下:

# ... 其他代码 ...
logger.info("Art manager started")
self.main_window_specification = self.app.window(best_match=expected_window_title)
logger.debug(f"Type of self.main_window_specification: {type(self.main_window_specification)}")

# 直接打印控件标识符到控制台
logger.debug("输出控件标识符到控制台:")
self.main_window_specification.print_control_identifiers()

# 将控件信息写入日志
control_info = self.main_window_specification.dump_tree()
logger.debug("日志记录的控件信息:\n" + control_info)

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:23:12