为什么pywinauto执行命令间存在10秒延迟?如何缩短该延迟?
pywinauto操作延迟缩短方案
延迟核心原因
pywinauto默认设置了较高的全局控件查找超时,且每次从应用根层级重复查找控件会产生额外的等待开销,默认超时通常为5~10秒,和你遇到的现象一致。
具体优化方案
调整全局超时配置
直接修改pywinauto的全局计时参数,缩短默认的控件等待超时时间:
from pywinauto import timings # 将默认超时从默认的5秒改为1秒,可根据实际场景调整 timings.TIMEOUT_DEFAULT = 1 # 可选:缩短控件状态轮询的间隔时间 timings.TIMEOUT_UI_ELEMENT_READ_INTERVAL = 0.1缓存已定位的控件对象
不要每次操作都从
app根层级开始查找控件,提前把常用的父控件缓存下来,避免重复查找开销:原代码中每次循环都重复查找ListBox和子ListItem,可以提前把ListBox对象保存,后续直接调用。单次查找指定超时时间
调用
child_window查找控件时,主动传入timeout参数,覆盖全局默认配置:# 单次查找超时设为1秒 child_window(best_match=rselitem, timeout=1)优化列表遍历逻辑
不需要逐个构造
best_match查找列表项,直接获取列表的所有子项一次性遍历,效率提升非常明显:list_box = app.dlg.ListBox # 一次性拿到所有列表项 for item in list_box.items(): lditemtext = str(item.texts()) print(homenum, lditemtext) if homenum == lditemtext: item.double_click_input() break
其他操作(输入、取文本等)的优化逻辑
所有pywinauto的操作延迟都可以用上述方案优化:
- 调整全局timings参数降低默认等待时间
- 所有已经找到的控件都做缓存,不要每次从根层级重新查找
- 调用操作方法时如果支持timeout参数,主动传入更短的超时值
优化后的完整代码示例
from pywinauto.application import Application from pywinauto import timings # 先调整全局超时 timings.TIMEOUT_DEFAULT = 1 timings.TIMEOUT_UI_ELEMENT_READ_INTERVAL = 0.1 app = Application(backend="uia").connect(process=19840) dlg = app.windows() # 提前缓存列表控件 list_box = app.dlg.ListBox # 直接遍历所有列表项 for item in list_box.items(): lditemtext = str(item.texts()) print(homenum, lditemtext) if homenum == lditemtext: item.double_click_input() break
内容的提问来源于stack exchange,提问作者Mikotych
相关产品推荐
相关产品推荐

