wxWidgets / wxPython:从htmlWindow迁移到Webview

时间:2013-02-05 19:26:03

标签: python webview wxpython wxwidgets

我有一个使用htmlWindow的应用程序,并希望将其迁移到wx 2.9中的新webview。但是,我了解到没有可用于将JavaScript变量从网页传递回Python代码的内置方法。有一个RunScript方法允许用户将JavaScript发送到页面,但没有方法可以在用户点击或任何其他用户交互中检索元素ID。

我的问题是,这有什么解决方法吗?有没有办法拦截,比如说,警报电话或其他任何东西,并获取数据?如果无法从用户交互中接收数据,则webview显示的价值不大。

2 个答案:

答案 0 :(得分:1)

据我所知,从RunScript()获取返回值的唯一方法是使用页面标题hack。

e.g。在RunScript的某个地方,你将document.title设置为你想要检索的值,并使用GetCurrentTitle()将其设置为python,如果你希望在检索数据后可以重置标题。

因此,如果self.html是webview

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

如果你想从webview中启动它,可以通过覆盖wxEVT_COMMAND_WEB_VIEW_NAVIGATING来完成(如链接Robin发布的建议),这样当它接收到自定义url方案时,例如, 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

或者你可以使用这两个想法的组合并创建一个URL,当访问时调用GetPageTitle()并确保在调用页面之前设置document.title。

答案 1 :(得分:0)

最近有一些关于wx-users邮件列表的讨论以及对此类事情的解决方法的建议。我自己没试过,但你可能觉得它很有用。见https://groups.google.com/d/topic/wx-users/Pdzl7AYPI4I/discussion