如何将pywinauto控件标识符保存至变量(解决编码错误)
解决pywinauto控件标识符保存的UnicodeEncodeError并存入变量
问题背景
使用main_dlg.print_control_identifiers(filename="control_ids.text")保存控件标识符时,因目标程序包含希腊字符触发UnicodeEncodeError('charmap' codec can't encode characters),根源是该方法默认使用系统编码(如cp1252)写入文件,无法处理非ASCII字符。
核心解决方案:自定义log_func捕获内容到变量
利用print_control_identifiers的log_func参数,自定义函数将控件标识符内容收集到变量中,再以UTF-8编码写入文件:
from pywinauto import Application # 连接或启动目标应用,获取主窗口 app = Application().connect(title="你的窗口标题") # 若未启动可改用app.start("your_app.exe") main_dlg = app.window(title="你的窗口标题") # 初始化列表存储每一行控件标识符输出 control_ids_lines = [] def collect_control_ids(msg): control_ids_lines.append(str(msg)) # 调用方法,传入自定义收集函数 main_dlg.print_control_identifiers(log_func=collect_control_ids) # 将列表转为完整字符串 control_ids_content = '\n'.join(control_ids_lines) # 以UTF-8编码写入文件,避免编码错误 with open("control_ids.text", "w", encoding="utf-8") as output_file: output_file.write(control_ids_content)
原理说明
print_control_identifiers默认的log_func要么打印到控制台,要么用系统编码写入文件。通过自定义log_func,可以拦截每一行输出内容并存入列表,实现内容到变量的存储。- 最终用UTF-8编码写入文件,UTF-8支持所有Unicode字符(包括希腊文),彻底解决编码不兼容问题。
替代方案:直接指定文件编码写入
如果无需将内容存入变量,仅需正确写入文件,可直接打开UTF-8编码的文件并传递给log_func:
with open("control_ids.text", "w", encoding="utf-8") as f: main_dlg.print_control_identifiers(log_func=lambda msg: f.write(f"{msg}\n"))
内容的提问来源于stack exchange,提问作者Chris P
相关产品推荐
相关产品推荐

