关于python:使用pywinauto读取窗口中的值并在函数中使用

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

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

挑战来了。它需要"查看"单元格中的字符串,我可以使用AccExplorer或Inspect.exe轻松完成此操作。这是应用程序中的单元结构,带有所选项目"Cam 2"。应用程序中的单元格示例

显示单元格结果的AccExplorer窗口这是AccExplorer提供的结果。红色圆圈表示我要查找的"值",并用于比较。(我发现在"value"上搜索这个主题会导致答案过于含糊,而不是我的字面意思需要在本例中找到"value"的值。)

通过在脚本中使用此代码,在Acexplorer工具提供的窗口类中传递(类的红色箭头)

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

它不返回"value"字段,在这种情况下,它的属性应该是"cam 2"。

1
2
3
4
5
6
7
8
{'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,它将许多类名显示为重复项,并且不直接显示这一级别的单元值。

主要的问题是,我在获取这些数据时会犯什么错误,或者是否可能以这种方式获取这些数据?我愿意接受任何建议,甚至使用其他图书馆。我只是觉得这是最干净最简单的。谢谢!


有关开始,请阅读入门指南并查看一些示例

你选择不更好的方法来获取DataGridView的单元,尝试使用uia后端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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获取所有单元格:

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