我正在尝试开发一个基于Flask的跨平台桌面应用程序(作为本地服务器),与Chromium嵌入式浏览器简单窗口(作为客户端)捆绑在一起。 CEF客户端是针对Windows和Mac单独实现的,尽管这并不是完全跨平台的,但实际上还没有任何工作需要完成(就此而言,可以在此处告知,初始阶段在客户端,只使用CEF简单示例中已经提供的最小功能。
是否有将两者(客户端和服务器)打包在一起的最佳做法?在开发环境中,一切都按预期工作。启动客户端和服务器由一个单独的Python脚本控制,但我想知道是否有更好的解决方案来执行此操作(例如,在客户端使用某些方法来检查服务器是否正在运行,并启动如果它不是......)。我也想知道这是否是开发跨平台桌面应用程序的好方法。也许在原生窗口中打包基于HTML的桌面应用程序是一种更好的方法吗?
答案 0 :(得分:1)
我没有关于CEF的答案,但我看了两个解决方案,将基于HTML的桌面应用程序打包在原生窗口中:
将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()
它使用Webkit打开一个窗口,其中显示HTML。我发现的问题是结果看起来不如现代网络浏览器那么好,结果是像素化和慢速。但是,如果这对你来说比你有一个解决方案好;)
我现在正试图看看是否可以让python与node-webkit进行通信,看起来非常有前途。我问了here这个问题,但我没有得到任何答案。如果您有兴趣,请查看this example。我不能让它工作,但它看起来很有希望。