2013-02-05 14 views
0

我有一個應用程序使用htmlWindow,並希望將其遷移到wx 2.9中的新webview。但是,我已經瞭解到,沒有內置的方法可以將JavaScript變量從網頁傳遞迴Python代碼。有一個RunScript方法允許將JavaScript發送到頁面,但沒有方法在用戶單擊或任何其他用戶交互時檢索元素標識。wxWidgets/wxPython:從htmlWindow遷移到Webview

我的問題是,是否有任何解決方法呢?有什麼方法可以攔截警報呼叫或其他任何方式並獲取數據?如果用戶無法接收來自用戶交互的數據,則該網頁視圖顯示沒有多大價值。

回答

1

據我所知,從RunScript()獲取返回值的唯一方法是使用頁面標題hack。

例如如果您希望在檢索數據後重置標題,則可以在RunScript的某處將document.title設置爲您希望檢索的值,並使用GetCurrentTitle()將其獲取到python中。

所以,如果self.html是web視圖

self.html.RunScript(""" 
    //javascript goes here 
    // variable we wish to retrieve is called return_value 
    document.title = return_value 
    """) 
r = self.html.GetCurrentTitle() 

如果你想通過覆蓋wxEVT_COMMAND_WEB_VIEW_NAVIGATING從網頁流量是可以做到的(如在羅賓發佈的鏈接提示)中啓動它,這樣當它收到自定義網址方案,例如retrieveata:// data/....它從url中檢索數據,並執行您想要的任何操作,確保您在某個時刻調用evt.Veto()。然後,您可以通過簡單地從JavaScript內調用合適的URL來傳遞任何數據。下面

完全未經測試的代碼(只是給你的是如何做的想法)

def OnPageNavigation(self, evt): 
    url = evt.GetUrl() 
    if url.startswith("retrievedata://data/"): 
     data = url[len("retrievedata://data/"):] 
     evt.Veto() 
     // Do whatever you want with the data 

另外,您可以使用這兩個概念的結合,創造一個單一的網址訪問時調用GetPageTitle( ),並確保在調用頁面之前設置document.title。

+0

謝謝。我可能能夠在我的應用程序中工作。希望wx能有一種正式的方式來儘快返回數據。 – Tim

0

最近有關於wx用戶郵件列表的一些討論以及針對這種情況的解決方法的建議。我沒有嘗試過,但你可能會覺得它很有用。請參閱https://groups.google.com/d/topic/wx-users/Pdzl7AYPI4I/discussion

+0

謝謝,但這些解決方法似乎是按鈕或鏈接。我需要能夠在用戶點擊甚至懸停時將元素(div,span,p等)的id返回給Python。 JavaScript可以返回一個變量,但我需要一種方法將變量獲取到Python代碼中。 – Tim