pywinauto:如何在不接受SendKeys的ListView上发送Key?

时间:2017-03-01 17:58:53

标签: python python-3.x pywinauto ditto

我确实从列表中选择了一个项目(使用下面的代码),我现在需要发送ctrl+E。问题是以某种方式SendKeys方法isn't available,我不能使用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'中的'keyboard'(['','Header'])'

[编辑](更多错误)

ditto.ditto.SysListView321.type_keys('^e')
  

win32gui.SetForegroundWindow(self.handle)pywintypes.error:(0,   'SetForegroundWindow','没有错误消息可用')

 keyboard.send_keys('^e')
  

AttributeError:模块'pywinauto.keyboard'没有属性'send_keys'

(适合初学者的Ps. app.Ditto相当于app.window(best_match='Ditto')

2 个答案:

答案 0 :(得分:2)

对于指定的UI元素,此方法为

# 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。只学习Python基础知识,你也会更好地理解pywinauto。

答案 1 :(得分:1)

完成瓦西里的回答。以下是编辑单个同上项目所需的代码(大部分时间都可以使用)

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()