Использование pywinauto для чтения значения в окне и использования в функции
Я строю сценарий автоматизации с использованием Python с использованием Pywinauto, и я нахожусь в тупике на этой части. Пока я могу запустить приложение или подключиться к нему. Я переключал окна в интерфейсе, и теперь ему нужно каким-то образом прочитать значение и сравнить его с содержимым CSV-файла и продолжить работу с дополнительными функциями. Приложение имеет несколько окон, и одно из них использует интерфейс типа электронных таблиц. Там нет функции поиска / замены, иначе я мог бы просто использовать это.
Теперь приходит вызов. Он должен "видеть" строку внутри ячейки, и я легко могу сделать это, используя AccExplorer или Inspect.exe. Это структура ячеек в приложении с выбранным элементом "CAM 2". Пример ячейки из приложения
Окно AccExplorer, показывающее результаты ячейки. И это результат, предоставленный AccExplorer. Красный кружок указывает "значение", которое я хочу найти и использовать для сравнения. (Я обнаружил, что поиск этой темы по "значению" приводит к слишком расплывчатым ответам, а не к моей буквальной необходимости найти значение "значения" в этом случае.)
Используя этот код в моем скрипте, передавая класс окна, предоставленного инструментом AccExpolorer (красная стрелка для класса)
edit = wdow['WindowsForms10.Window.8.app.0.378734a']
props = edit.GetProperties()
print(props)
Он не возвращает поле "Значение" или его свойство в этом случае должно быть "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, и он отображает множество имен классов в виде дубликатов и не показывает этот уровень значений ячеек напрямую.
Главный вопрос: что бы я делал неправильно, чтобы получить эти данные, или это вообще возможно? Я открыт для любых предложений или даже использования других библиотек. Я просто подумал, что это будет самым чистым и простым. Спасибо!
1 ответ
Для начала прочитайте руководство по началу работы и посмотрите некоторые примеры
Вы выбираете не лучший способ получить ячейку 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" или получить все ячейки, используя лямбду:
cells = [child for child in datagrid.descendants() if child.element_info.control_type == "DataItem"]
for cell in cells:
print(cell.legacy_properties()['Value'])