wxWidgets/wxPython: 从htmlWindow迁移到Webview

0 投票
2 回答
914 浏览
提问于 2025-04-17 14:52

我有一个应用程序,它使用了htmlWindow,现在我想把它迁移到wx 2.9里的新webview。不过,我发现没有内置的方法可以把网页中的JavaScript变量传回Python代码。虽然有一个RunScript的方法可以把JavaScript发送到网页,但没有办法在用户点击或其他交互时获取元素的ID。

我的问题是,有没有什么解决办法?有没有办法拦截,比如说,一个警告框的调用或者其他什么东西,来获取数据?如果不能从用户的交互中接收数据,那么webview的显示就没什么价值了。

2 个回答

0

最近在wx-users邮件列表上有一些讨论,大家提到了一些解决类似问题的建议。我自己还没有试过,但你可能会觉得这个方法有用。可以查看一下这个链接:https://groups.google.com/d/topic/wx-users/Pdzl7AYPI4I/discussion

1

据我所知,从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。

撰写回答