0

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

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

4

2 回答 2

1

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

例如,在 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 方案时,例如,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

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

于 2013-02-07T23:48:16.213 回答
0

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

于 2013-02-05T20:09:24.100 回答