【问题标题】:Python Desktop Application with the Browser as an interface?以浏览器为界面的 Python 桌面应用程序?
【发布时间】:2011-02-06 09:39:09
【问题描述】:

我想创建一个在用户计算机上运行的应用程序,一个独立的应用程序,包括安装和其他,但我希望界面是一个浏览器,可以是内部的并显示为操作系统窗口或外部可访问使用浏览器(即一些 http 服务器)。

原因可能是因为我对 Python 知之甚少,但我认为只要我有一些可以使用和操作的基本根,我就可以管理,那就是 HTML、CSS 和 Javascript。

我还没有找到一个我可以使用的好的 GUI 工具,并且总是在尝试弄乱并最终没有得到任何东西之后放弃这个想法。

【问题讨论】:

    标签: python browser desktop httpserver


    【解决方案1】:

    您可以使用Pyjamas。它是 Google Web Toolkit 到 Python 的一个端口,这基本上意味着你用 Python 编写代码,它会被编译成 HTML 和 JS。

    【讨论】:

    • 除非它不是,因为它的最新提交只是几周前。
    【解决方案2】:

    有很多优秀的 GUI 工具可以让您按照自己的方式创建 GUI——HTML、CSS 和 Javascript。如果您不知道,请使用正确的标签在单独的问题中提问。

    在这样的安排中,Python 端应该没有自己的 GUI,而只是运行 Python 标准库的 HTTP 服务器的子类,只是通过 JSON 在其他 URL 上提供 HTML、CSS 和 JS 文件和数据JS 可以通过 Ajax 技术实现,本质上是实现存储和业务逻辑——所以你可能想要什么“GUI 工具”远非显而易见?!

    只需单独开发 Python 端(例如,使用 IDLE、Wingware、SPE 或任何你喜欢的东西)和 HTML/CSS/Javascript,使用它自己的“GUI 工具”。毕竟,Python 对这些文件所做的一切都是静态地服务它们。

    您可能正在考虑使用一些 Python 端模板,例如 Mojo &c,但我的建议是避免这种情况:而是一直使用“瘦服务器架构”,使 Python 端成为业务的 RESTful 服务器逻辑和存储层,而所有 GUI 在浏览器中工作。

    【讨论】:

    • 这是一种方法,但其他语言(例如 .NET 语言)具有允许将浏览器轻松嵌入窗口并编写脚本或通过简单 API 进行通信的库。我自己曾多次发现这很有用,但在 Python 中找不到等价物。 wxPython 有一个浏览器小部件,但它已经过时了,甚至不支持脚本 IIRC。 Tk 什么都没有。有一个用于 GUI 工具包的 Webkit 嵌入,但是在后面编译和集成是一件非常痛苦的事情。
    • 我想我正在寻找 Max 所说的,一种可以通过 JS API 与桌面应用程序直接通信的嵌入式浏览器。
    【解决方案3】:

    Python 提供了两件你应该感兴趣的东西:

    • 标准库中的 Web 服务器
    • Web 应用程序的标准化接口,称为 WSGI

    因此,向您的应用程序添加 Web 界面相对容易。例如,在 Mercurial(版本控制系统)中,您有一个命令 hg serve 来启动 Web 服务器。

    要查看 python 启动 Web 服务器和 WSGI 应用程序,只需执行以下操作:

    python -m 'wsgiref.simple_server'
    

    你可以看wsgiref源码或者一些WSGI教程来做一个简单的app。

    之后,您可能想使用网络框架(用于模板和合作),但这是另一个问题...

    【讨论】:

    • 为了完整起见,应该提到将后端作为 localhost wsgiref http 服务器运行意味着任何登录到机器的用户都可以使用它,而不仅仅是启动服务器的用户。如果您是唯一的用户,那当然不是问题;如果有多个用户,也许它甚至可以被视为一个功能。
    【解决方案4】:

    您是否仅仅因为使用 Python 小部件工具包(如 Tkinter、wxpython 和 pyqt)遇到困难而求助于网络浏览器?

    你试过Qt Designer吗?它是一个图形 GUI 设计器,使开发美观的 GUI 变得非常快速和容易。它会随 PyQt 自动安装。

    http://www.riverbankcomputing.co.uk/software/pyqt/download

    【讨论】:

    • 是和不是。我确实对 GUI 工具包有疑问,对我来说,作为一名 Web 开发人员,使用标准 HTML 和 JavaScript 要容易得多。如果我没有 Qt 许可证,Qt 不是仅适用于非商业应用程序吗?
    • @Eli,Qt 拥有双重 LGPL/商业许可证。基本上,如果你打算发布你的应用程序,你要么需要开源它,要么获得商业许可。
    【解决方案5】:

    一个简单的 gui 演示如何在浏览器中使用 python 对话:

    sqr.py

    import http.server
    
    class TestHandler(http.server.SimpleHTTPRequestHandler):
    
        def do_POST(self):
            """Handle a post request by returning the square of the number."""
            length = int(self.headers.get_all('content-length')[0])
            data_string = self.rfile.read(length)
            x = float(data_string)
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            self.flush_headers()
            self.wfile.write(str(x**2).encode())
    
    server = http.server.HTTPServer(("", 8004), TestHandler)
    server.serve_forever()
    

    sqrt.html

    <body>
    <label for="fname">input x:</label>
    <input type="text" id="fname" name="fname" onkeyup="runbuttonfunc()" value="4.0"><br>
    <button id="runButton" onclick="runbuttonfunc()">=</button><br>
    <label for="lname">output x*x:</label>
    <input type="text" id="lname" name="lname"><br>
    
    <script type="text/javascript">
    
    function xml_http_post(url, data) {
        var req = new XMLHttpRequest();
        req.open("POST", url, true);
        req.onreadystatechange = function() {
            if (req.readyState == 4) {
                document.getElementById('lname').value = req.responseText
            }
        }
        req.send(data);
    }
    
    function runbuttonfunc() {
        xml_http_post("sqr.html", document.getElementById('fname').value)
    }
    </script>
    </body>
    

    使用python3 sqr.py 运行程序,并在浏览器中使用地址http://localhost:8004/sqr.html

    该示例源自How to implement a minimal server for AJAX in Python?http.server 是 python 的内置模块。然而,周围应该有许多其他工具。

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 2011-03-30
      • 2016-08-23
      • 2013-09-01
      • 1970-01-01
      • 2012-02-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多