基于Flask的桌面应用,打包了嵌入Chromium框架的客户端

3 投票
1 回答
3353 浏览
提问于 2025-04-18 10:49

我正在开发一个跨平台的桌面应用,使用Flask作为本地服务器,同时嵌入一个简单的Chromium浏览器窗口作为客户端。CEF客户端在Windows和Mac上是分别实现的,虽然这不完全算是跨平台,但在项目的初始阶段,客户端几乎不需要做什么工作,只需使用CEF简单示例中提供的基本功能。

有没有什么好的方法可以把这两个部分(客户端和服务器)打包在一起?在开发环境中,一切都按预期工作。启动客户端和服务器是通过一个单独的Python脚本来控制的,但我在想有没有更好的解决方案(比如在客户端检查服务器是否在运行,如果没有就启动它……)。我也在考虑这种方式是否适合开发跨平台的桌面应用。也许还有其他更好的方法可以把基于HTML的桌面应用打包在一个看起来像原生应用的窗口里?

1 个回答

1

我对CEF没有答案,但我看了两种方法,可以把基于HTML的桌面应用放在一个看起来像原生应用的窗口里:

  • PySide
  • Node-Webkit

使用PySide和Flask结合起来其实很简单,只需要在你的Flask应用的app.py文件附近加上以下脚本,就可以直接使用:

import os, urllib, sys, time, json

# import PySide
from PySide.QtGui import *
from PySide.QtWebKit import *
from PySide.QtCore import *

# import Flask
from app import app as application

class WebApp(QThread):
    def setApplication(self, app, setup_callback):
        self.application = app
        self.setup_callback = setup_callback

    def run(self):
        self.setup_callback()
        self.application.run(use_debugger=True, debug=True, use_reloader=False, port=5000)

def main():
    global web, env

    # Init Flask server
    webappThread = WebApp()
    def setup_callback():
        print 'Do something specific here before app start'
    webappThread.setApplication(application, setup_callback)
    webappThread.start()

    # Init QT app
    app = QApplication(sys.argv)

    # Setup WebView (WebKit)
    web = QWebView()
    web.resize(992, 800)
    web.setWindowTitle('Application Name')
    # web.setWindowIcon(QIcon('static/img/icon.png'))
    qr = web.frameGeometry()
    cp = QDesktopWidget().availableGeometry().center()
    qr.moveCenter(cp)
    web.move(qr.topLeft())  

    web.setUrl('http://127.0.0.1:5000/')

    # Bind shut down
    def shutdown():
        webappThread.quit()
    app.aboutToQuit.connect(shutdown)

    # Start up
    web.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

这样就会打开一个窗口,里面显示你的HTML内容,使用的是Webkit。不过我发现的问题是,效果看起来没有在现代网页浏览器上那么好,显示的内容有点模糊,而且速度也比较慢。不过,如果你觉得这样可以接受,那这就是一个解决方案;)

我现在在尝试让Python和Node-Webkit进行通信,这看起来很有前景。我在这里问了个问题,但没有得到任何回复。如果你感兴趣,可以看看这个例子。我没能让它工作,但它确实看起来很有希望。

撰写回答