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']) |