wxWidgets/wxPython: 从htmlWindow迁移到Webview
我有一个应用程序,它使用了htmlWindow,现在我想把它迁移到wx 2.9里的新webview。不过,我发现没有内置的方法可以把网页中的JavaScript变量传回Python代码。虽然有一个RunScript的方法可以把JavaScript发送到网页,但没有办法在用户点击或其他交互时获取元素的ID。
我的问题是,有没有什么解决办法?有没有办法拦截,比如说,一个警告框的调用或者其他什么东西,来获取数据?如果不能从用户的交互中接收数据,那么webview的显示就没什么价值了。
2 个回答
最近在wx-users邮件列表上有一些讨论,大家提到了一些解决类似问题的建议。我自己还没有试过,但你可能会觉得这个方法有用。可以查看一下这个链接:https://groups.google.com/d/topic/wx-users/Pdzl7AYPI4I/discussion
据我所知,从RunScript()获取返回值的唯一方法就是使用页面标题的技巧。
比如在RunScript的某个地方,你可以把document.title设置为你想要获取的值,然后通过GetCurrentTitle()把它拿到Python里。如果你愿意,在获取数据后可以把标题重置回去。
所以如果self.html是网页视图的话,
self.html.RunScript("""
//javascript goes here
// variable we wish to retrieve is called return_value
document.title = return_value
""")
r = self.html.GetCurrentTitle()
如果你想在网页视图内部启动这个功能,可以按照Robin提供的链接中的建议,重写wxEVT_COMMAND_WEB_VIEW_NAVIGATING事件。这样,当它接收到一个自定义的URL,比如retrievedata://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,当访问这个URL时调用GetPageTitle(),并确保在调用页面之前设置document.title。