使用pywinauto找不到Google地球的“文件”属性

问题描述:

我想在Windows 10平台上使用Python(3.6)和pywinauto(0.6.3)来控制Google地球(7.1.8.3036)以保存Google地球图像到一个文件。我可以从pywinauto启动Google地球并获取Google地球对话框,但无法找到'文件'的属性。我曾尝试使用app['Google Earth'].print_control_identifiers(),但无法看到'文件'的任何属性(要包含在这里)。使用pywinauto找不到Google地球的“文件”属性

我感谢任何帮助或建议如何做app['Google Earth'].???('File -> Save -> Save Image...')。一个简单的替代方法是在活动的Google地球窗口上使用热键(Ctrl + Alt + S)。我曾尝试使用SendKeys('^%S')type_keys('^%S'),但这些都不起作用。我不能做正确的事。

在这里,我如何试图启动谷歌地球,并找出是否有是为“文件”的任何属性:

app = Application(backend='uia').start('c:/Program Files (x86)/Google/Google Earth/client/googleearth.exe') 

app['Google Earth'].File.click() 

Traceback (most recent call last): File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\application.py", line 245, in __resolve_control criteria) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\timings.py", line 447, in wait_until_passes raise err pywinauto.timings.TimeoutError

在处理上述异常,另一个异常:

Traceback (most recent call last): File "", line 1, in File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\application.py", line 351, in getattribute ctrls = self.__resolve_control(self.criteria) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\application.py", line 248, in __resolve_control raise e.original_exception File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\timings.py", line 425, in wait_until_passes func_val = func(*args) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\application.py", line 209, in __get_ctrl ctrl = self.backend.generic_wrapper_class(findwindows.find_element(**ctrl_criteria)) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\findwindows.py", line 84, in find_element elements = find_elements(**kwargs) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\findwindows.py", line 300, in find_elements elements = findbestmatch.find_best_control_matches(best_match, wrapped_elems) File "C:\Users\Brian\AppData\Local\Programs\Python\Python36\lib\site-packages\pywinauto\findbestmatch.py", line 533, in find_best_control_matches raise MatchError(items = name_control_map.keys(), tofind = search_text) pywinauto.findbestmatch.MatchError: Could not find 'File' in 'dict_keys(['Tour GuidePane', 'Tour Guide', 'Pane', '', 'Custom', '0', '1', '2', 'Pane0', 'Pane1', 'Pane2', '3', 'Pane3', '4', 'Pane4', '5', 'Pane5', '6', 'Pane6', '7', 'Custom0', 'Custom1', 'Custom2', '8', 'Custom3', '9', 'Custom4', '10', 'Custom5', '11', 'Custom6', '12', 'Custom7', '13', 'Custom8', '14', 'Custom9', '15', 'Custom10', '16', 'Custom11', '17', 'Custom12', '18', 'Custom13', '19', 'Custom14', '20', 'Custom15', '21', 'Custom16', '22', 'Custom17', '23', 'Custom18', '24', 'Custom19', '25', 'Custom20', '26', 'Custom21', '27', 'Custom22', '28', 'Custom23', '29', 'Custom24', '30', 'Custom25', '31', 'Custom26', '32', 'Custom27', '33', 'Custom28', '34', 'Custom29', '35', 'Custom30', '36', 'Custom31', '37', 'Custom32', '38', 'Custom33', '39', 'Custom34', '40', 'Custom35', '41', 'Custom36', '42', 'Custom37', '43', 'Custom38', '44', 'Custom39', '45', 'Custom40', '46', 'Custom41', '47', 'Custom42', '48', 'Custom43', '49', 'Custom44', '50', 'Custom45', '51', 'Pane7', '52', 'Pane8', '53', 'Pane9', '54', 'Pane10', '55', 'Pane11', '56', 'Pane12', '57', 'Pane13', '58', 'Pane14', '59', 'Custom46', '60', 'Custom47', '61', 'Custom48', '62', 'Custom49', '63', 'Custom50', '64', 'Custom51', '65', 'Custom52', '66', 'Custom53', '67', 'Custom54', '68', 'Custom55', '69', 'Custom56', '70', 'Custom57', '71', 'Custom58', '72', 'Custom59', '73', 'Custom60', '74', 'Custom61', '75', 'Custom62', '76', 'Custom63', '77', 'TitleBar', 'System', 'SystemMenu', 'Menu', 'System0', 'System1', 'System2', 'SystemMenuItem', 'MenuItem', 'Minimize', 'MinimizeButton', 'Button', 'Maximize', 'MaximizeButton', 'Button0', 'Button1', 'Button2', 'CloseButton', 'Close', 'Button3'])'

+0

欢迎堆栈溢出。在这个网站,你有望尝试自己编写的代码。在做了更多的研究之后,如果您遇到问题,您可以发布**您尝试过的内容,并清楚说明什么不工作**并提供最小化,完整和可验证的示例。我建议阅读[如何问](https://*.com/help/how-to-ask)一个很好的问题和[完美的问题](http://codeblog.jonskeet.uk/2010/08/29 /写最完美的 - 问题/)。另外,一定要参加[tour](https://*.com/tour)并阅读[this](https://meta.*.com/q/347937/6676466)。 –

+0

首先您需要展开“文件”子菜单。谷歌地球是一个Qt5应用程序,所以你可以看看在回购指南中的WireShark例子(这也是Qt5)。子菜单可以通过'.invoke()'进行扩展。 –

我找到了一种通过使用热键(Ctrl + Alt + S)在Google Earth中保存KML文件图像的方法。但是这打破了使用pywinauto的关键目的。我仍然在寻找更好的方法来利用pywinauto来控制Google地球。 下面是评论沿着我的Python代码:

import os, time 
from pywinauto import Application 
from pywinauto import keyboard 

kmlfile = 'rcglic1457645225.kml' 
kmlimage= kmlfile[:-3]+'jpg' 
os.startfile(kmlfile) 
time.sleep(15)  #wait for completely loading Google Earth 

app = Application(backend='uia').connect(path='googleearth.exe') #connect to the Google Earth process 
dlg = app['Google Earth'] #connect to the Google Earth dialog 
dlg['Maximize'].click()  #click on 'Maximize' button of the Google Earth window to have the best image 
time.sleep(1) 
keyboard.SendKeys('^%S') #hot keys to save the image (Ctrl+Alt+S) 
keyboard.SendKeys(kmlimage+'{ENTER}') #enter the image file name 
keyboard.SendKeys('{TAB}{ENTER}')  #use TAB to select 'Yes' and replace file if existed 
dlg['Restore'].click()  #click on 'Restore' button of the Google Earth window to go back to normal 
dlg['Close'].click()   #click on 'Close' button 
keyboard.SendKeys('{TAB}{ENTER}')  #use TAB to select 'Discard' and close the Google Earth window