Настольное приложение на основе Flask в комплекте со встроенным клиентом фреймворка Chromium

Я пытаюсь разработать кроссплатформенное настольное приложение на основе Flask (в качестве локального сервера), связанное с простым окном встроенного браузера Chromium (в качестве клиента). Клиент CEF реализован отдельно для Windows и Mac, и, хотя это не совсем кроссплатформенный вариант, практически нет необходимости выполнять работу (насколько можно было бы сказать на этом начальном этапе проекта) на платформе клиентская сторона, просто используя минимальную функциональность, уже предоставленную в простых примерах CEF.

Есть ли какие-либо передовые методы объединения двух (клиента и сервера) вместе? В среде разработки все работает как положено. Запуск клиента и сервера управляется отдельным скриптом Python, но мне интересно, есть ли лучшее решение для этого (например, использование некоторых методов на стороне клиента, чтобы проверить, запущен ли сервер, и запустить его, если это не ...). Мне также интересно, подходит ли это для разработки кроссплатформенных настольных приложений. Может быть, есть лучший способ упаковки настольных приложений на основе HTML в окно, которое выглядит как нативно?


person Slobodan Ilic    schedule 23.06.2014    source источник


Ответы (1)


У меня нет ответа по поводу CEF, но я рассмотрел два решения для упаковки настольного приложения на основе HTML во внутреннее окно:

  • PySide
  • Узел-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, что выглядит очень многообещающим. Я задал вопрос здесь по этому поводу, но я не получил ответа отвечать. Если вам интересно, взгляните на этот пример. Я не мог не заставить его работать, но он определенно выглядит многообещающим.

person AdrienG    schedule 12.08.2014