如何用Python的pywinauto点击DAQ Viewer的Convert下拉菜单?
问题:pywinauto自动化老旧DAQ Viewer转换.dds文件至Excel失败
背景
我有三台锅炉一年的每小时蒸汽数据,单小时数据均存储为独立.dds文件。必须通过一款老旧的Data Acquisition Viewer(DAQ Viewer)打开文件并转存,才能导出数据。使用Python 3.10+pywinauto编写脚本时,循环打开第一个.dds文件的逻辑正常,但无法点击“Convert”下拉菜单;此前尝试用键盘TAB+ENTER定位该菜单也失败。怀疑问题源于两点:
- DAQ Viewer版本过旧,与部分pywinauto函数不兼容
- 文件在Viewer中以独立窗口打开,存在子窗口识别问题
可正常运行的代码
import os import time import pywinauto from pywinauto import timings directory = "C:/python-test/Boiler2" viewer_exe = "C:/python-test/DAQSTANDARD Viewer/DxViewerE.exe" app = pywinauto.Application(backend='win32') app.start(viewer_exe) main_window = app.window(title='Data Viewer') time.sleep(0.5) for filename in os.listdir(directory): if filename.endswith(".dds"): dds_file = os.path.join(directory, filename) main_window.type_keys('^o') time.sleep(0.5) open_dialog = app.window(title="Open") time.sleep(0.5) open_dialog.type_keys("{TAB}{TAB}{TAB}") time.sleep(0.5) open_dialog.type_keys("{DOWN}") time.sleep(0.5) open_dialog.type_keys("{ENTER}") time.sleep(0.5) open_dialog.type_keys("{TAB}") time.sleep(0.5) open_dialog.type_keys(filename) time.sleep(0.5) open_dialog.type_keys("{ENTER}") time.sleep(0.5)
尝试的无效转换代码
main_window.click(title='Convert', control_type='Button') time.sleep(0.2) main_window.click(title='To Excel', control_type='Button') time.sleep(0.2) export_dialog = app.window(title='Convert', lvisible=True) time.sleep(0.2) export_dialog.click(title='Ok', control_type='Button') main_window.menu_select("File -> Close")
错误信息
line 43: main_window.click(title='Convert', control_type='Button') TypeError: HwndWrapper.click() got an unexpected keyword argument 'title'
解决方案
这个错误是因为click()方法本身不接受title或control_type参数——这些参数用于定位控件,而非作为点击方法的参数。正确逻辑是先定位到目标控件,再调用click()方法。
修改后的转换代码
# 定位Convert按钮并点击 convert_btn = main_window.child_window(title='Convert', control_type='Button') convert_btn.click() time.sleep(0.2) # 定位To Excel选项并点击 to_excel_btn = main_window.child_window(title='To Excel', control_type='Button') to_excel_btn.click() time.sleep(0.2) # 处理转换对话框 export_dialog = app.window(title='Convert', visible=True) ok_btn = export_dialog.child_window(title='Ok', control_type='Button') ok_btn.click() time.sleep(0.2) # 关闭当前文件 main_window.menu_select("File -> Close")
额外优化建议
- 替换固定延迟:尽量减少
time.sleep(),改用pywinauto内置的等待机制,避免因系统延迟不稳定导致失败,例如:convert_btn.wait('visible', timeout=5).click() - 排查控件结构:如果仍无法定位控件,可打印窗口的所有控件标识符,确认控件的真实属性:
main_window.print_control_identifiers() - 处理独立子窗口:若文件以独立窗口打开,可通过
app.windows()列出所有窗口,找到对应子窗口的句柄后再操作。
内容的提问来源于stack exchange,提问作者kgoss
相关产品推荐
相关产品推荐

