0

我试图在提交表单时将简单表单​​的内容传递给 URL 参数。HTML 代码在在线 HTML 模拟器上工作,但在 wx.html2.WebView 中不起作用。使用 wxPython v4 和 python 3.6。演示问题的代码,

import wx
import wx.html2


class MyBrowser(wx.Dialog):

    def __init__(self, *args, **kwds):
        wx.Dialog.__init__(self, *args, **kwds)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.browser = wx.html2.WebView.New(self)
        sizer.Add(self.browser, 1, wx.EXPAND, 10)
        self.SetSizer(sizer)
        self.SetSize((700, 700))

        self.Bind(wx.html2.EVT_WEBVIEW_NAVIGATING, self.OnHTMLNavigate, self.browser)

    def OnHTMLNavigate(self, event):
        targetUrl = event.GetURL()
        print(targetUrl) # format about:<link_info>
        event.Veto()  # stops the link from executing

if __name__ == '__main__':
    app = wx.App()
    dialog = MyBrowser(None, -1)

    text = """
<!DOCTYPE html>
<html>
<body>
<form action="/action_page.php" method="get">
  First name: <input type="text" name="fname"><br>
  <input type="submit" value="Submit">
</form>
<p>Click on the submit button, and the input will be sent to a page on the server called "/action_page.php".</p>
</body>
</html>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
"""

    dialog.browser.SetPage(html=text, baseUrl="")
    dialog.Show()
    app.MainLoop()

程序的输出是,

about:/action_page.php

而在 html 模拟器中是,

/action_page.php?fname=myname

我想要做的核心是从 html2.WebView 获取信息回到 python 程序。我发现的唯一方法是拦截导航事件,并解析 URL 参数。我在 Rubin 的一篇文章中发现了这种方法。

附带说明一下,我能够使用 javascript 构造通过按钮实现所需的结果,也就是说,URL 告诉我从 web 视图中按下了哪个按钮。这是一个片段,解释了我是如何做到的,

<input id="myButton" type="button" class="button" \
                   onclick="location.href='action/?type=button&name=myButton&cb=myCallback&text=myButtonLabel';" \
                   value="myButtonLabel" />

按钮习惯用法对我来说非常有效,因为我能够使用我需要的额外参数构造 URL,例如回调允许我让每个按钮调用不同的回调。理想情况下,我也想用表单来做到这一点。因此,如果有另一种方法(javascript?),我可以使用我的额外信息和文本表单数据创建表单 URL GET 提交响应,我会很感激。

免责声明:无论如何,我都不是网络开发人员。但是我必须通过 webview 呈现......我曾经使用 wxPython html 窗口,但毕业到 html2.webview 以尝试获得更多功能。

4

1 回答 1

0

无法找出上述问题,但最终得到了最终解决方案,看起来像这样,

<form>
  myEnterTextLabel:<br><input type="text" id="myID">
  <input type="button" value="Submit" onclick="text_entry_action('myCh', 'myID', 'myCB')">
  <script type="text/javascript">
    function text_entry_action(ch, id, cb) {
      var input_obj = document.getElementById(id);
      var myurl = ch + "/?type=text_entry&value=" + input_obj.value + "&cb=" + cb;
      window.location.href = myurl;
    }
  </script>
</form>

在应用程序中,上述代码段中的所有 my<> 值都在代码段发送到 webview 之前以编程方式填充。

然后使用上面的 OnHTMLNavigate() 方法,截取 URL,提取值,然后可以使用 getattr() 函数从回调字符串中运行一个方法。从 webview 上下文回到 python 上下文。

于 2018-03-05T00:20:40.980 回答