pywinauto: как отправить ключи на ListView, который не принимает SendKeys?
Я выбрал элемент из списка (используя код ниже), теперь мне нужно отправить ctrl+E
, Проблема в том, что каким-то образом метод SendKeys недоступен, я не могу использовать SendKeys('^e')
, (Этот ярлык будет редактировать выбранный элемент в то же приложение)
from pywinauto.application import Application
from pywinauto import findbestmatch
from pywinauto import keyboard #not sure if I need to import it
ditto=Application().connect(path='Ditto.exe')
#---- print all available methods of the object
print(dir(ditto.ditto.SysListView321.wrapper_object())) #( the list does not contains 'SendKeys')
#-----Find and select the item (containing 'xxx') in the SysListView321
#The list of texts to search through
texts = ditto.ditto.SysListView321.texts()[1:] #skip window text itself, use only item texts
# The list of items corresponding (1 to 1) to the list of texts to search through.
items = ditto.ditto.SysListView321.items() #>>[]
found_item = findbestmatch.find_best_match('xxx', texts, items, limit_ratio=0.1).Select()
Некоторые ошибки:
ditto.ditto.SysListView321.SendKeys('^e')
... Класс WindowSpecification не имеет метода SendKeys
ditto.ditto.SysListView321.keyboard.SendKeys('^e')
... findbestmatch.MatchError: Не удалось найти 'клавиатуру' в 'dict_keys ([' ',' Header '])'
[РЕДАКТИРОВАТЬ] (больше ошибок)
ditto.ditto.SysListView321.type_keys('^e')
win32gui.SetForegroundWindow (self.handle) pywintypes.error: (0, "SetForegroundWindow", "Сообщение об ошибке недоступно")
keyboard.send_keys('^e')
AttributeError: модуль "pywinauto.keyboard" не имеет атрибута "send_keys"
(Пс. Для начинающих: app.Ditto
эквивалентно app.window(best_match='Ditto')
)
2 ответа
Для указанного элемента пользовательского интерфейса этот метод
# it will activate target window if it's not in focus
ditto.ditto.SysListView321.type_keys('^e')
но
keyboard.SendKeys('^e') # should work also if you don't change active window
Его можно использовать без привязки к какому-либо конкретному элементу управления.
Поэтому вы не должны пытаться использовать имя модуля (например, keyboard
) в качестве имени атрибута любого объекта. Это Питон. Просто изучите основы Python, и вы тоже поймете pywinauto.
Чтобы завершить ответ Василия. Вот код, необходимый для редактирования одного элемента то же самое (он работает... большую часть времени)
from pywinauto import findbestmatch
from pywinauto.application import Application
from pywinauto import remote_memory_block
from pywinauto import keyboard
from pywinauto import timings
import time #needed for time.sleep(3)
keyboard.SendKeys('^*') # custom shortcut to launch the specific ditto "group"
time.sleep(2) # wait 2 sec for the app
ditto=Application().connect(path='Ditto.exe')
time.sleep(0.5)
##find & select item
#The list of texts to search through:
texts = ditto.ditto.SysListView321.texts()[1:] #skip window text itself
# The list of items corresponding (1 to 1) to the list of texts to search through.
items = ditto.ditto.SysListView321.items() #>>[]
found_item = findbestmatch.find_best_match('test', texts, items, limit_ratio=0.1).Select()
## Extra: open the item in editor
# Bring the window to the foreground first
ditto.ditto.set_keyboard_focus() # (work also with set_focus but it remove the cursor)
# edit the selected entry (it's a shortcut)
keyboard.SendKeys('^e')
# Wait (for the windows to load)
time.sleep(1) # 1 sec
# Select all
keyboard.SendKeys('^a')
ditto.Editor.close()