使用 pywinauto 读取 window 中的值并在函数中使用

Using pywinauto to read a value within a window and use in a function

我正在使用 pywinauto 使用 python 构建一个自动化脚本,我对这部分感到困惑。到目前为止,我能够启动该应用程序或连接到它。我已经在界面中切换 windows,现在它需要以某种方式读取值并与 .csv 文件的内容进行比较,然后继续使用更多功能。该应用程序有多个 windows,其中一个使用电子表格类型的界面。没有 find/replace 功能,否则我可以使用它。

挑战来了。它需要 "see" 单元格中的字符串,我可以使用 AccExplorer 或 Inspect.exe 轻松完成此操作。 这是应用程序中的单元格结构,其中包含所选项目 "CAM 2"。 Cell example from the app

AccExplorer window showing results of the cell 这是 AccExplorer 提供的结果。红圈表示我要查找的"value",用于比较。 (我发现在 "value" 上搜索此主题会导致答案过于模糊,而不是我的文字需要在这种情况下找到 "value" 的值。)

通过在我的脚本中使用此代码,传入 AccExpolorer 工具提供的 window 的 class(class 的红色箭头)

edit = wdow['WindowsForms10.Window.8.app.0.378734a'] 
props = edit.GetProperties() 
print(props)

它不是 return "Value" 字段或其 属性 在这种情况下应该是 "Cam 2"

{'class_name': 'WindowsForms10.Window.8.app.0.378734a',
 'friendly_class_name': 'WindowsForms10.Window.8.app.0.378734a', 
'texts': [''], 'control_id': 1639674, 'rectangle': <RECT L0, T47, R1366, B746>, 
'is_visible': True, 'is_enabled': True, 'control_count': 76, 'style': 1442906112, 
'exstyle': 65536, 'user_data': 0, 'context_help_id': 0, 
'fonts': [<LOGFONTW 'MS Shell Dlg' -11>], 
'client_rects': [<RECT L0, T0, R1366, B699>], 
'is_unicode': True, 'menu_items': []}

我对 python(以及一般的编程)还比较陌生,但我在掌握所有这些方面做得很好。我知道后端,我没有幸运地使用 UIA,到目前为止它似乎在默认情况下工作。另外,我试过使用 SWAPY,它显示很多 class 重复的名称,并且不直接显示此级别的单元格值。

主要问题是获取这些数据我会做错什么,或者甚至可以通过这种方式获取数据?我愿意接受任何建议甚至使用其他库。我只是认为这将是最干净和最简单的。谢谢!

开始阅读 getting started guide 并查看一些示例

你没有选择更好的方法来获取 DataGridView 的单元格,请尝试为此使用 UIA 后端

from pywinauto import Desktop

dlg = Desktop(backend="uia")["YourApplicationName"]

# use that function for found your DataGridView
#dlg.print_control_identifiers()
datagrid = dlg.DataGridView

# use for found some particular cell
#datagrid.print_control_identifiers()

# in my case it was DataItem
cell = dlg.DataGridView.DataItem

# way to get item value
print(cell.legacy_properties()['Value'])

您还可以使用索引从许多相同的单元格中进行选择,例如 "DataItem0" 或使用 lambda 获取所有单元格:

cells = [child for child in datagrid.descendants() if child.element_info.control_type == "DataItem"]
for cell in cells:
    print(cell.legacy_properties()['Value'])