2017-08-12 69 views
0

我想在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://stackoverflow.com/help/how-to-ask)一個很好的問題和[完美的問題](http://codeblog.jonskeet.uk/2010/08/29 /寫最完美的 - 問題/)。另外,一定要參加[tour](https://stackoverflow.com/tour)並閱讀[this](https://meta.stackoverflow.com/q/347937/6676466)。 –

+0

首先您需要展開「文件」子菜單。谷歌地球是一個Qt5應用程序,所以你可以看看在回購指南中的WireShark例子(這也是Qt5)。子菜單可以通過'.invoke()'進行擴展。 –

回答

0

我找到了一種通過使用熱鍵(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