基础场景下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
相关产品推荐
相关产品推荐

