Create desktop application by using Flask and QtWebEngine.
Rather than open Flask app in user browser, create a QWebview and then run Flask app on it.
By default, every internal link is open inside the app and every external link is open in the default browser.
Note: Some releases require Conda to properly create a virtual environment.
There are 3 available versions:
Note: Both PyQt4 and PyQt5.6 are only made available for compatibility reasons, there is no intention to keep them updated unless requested.
If you want to install PyFladesk with pip you just run.
pip install pyfladesk
Only the latest version (PyQt5.10) is uploaded to PyPI. If you want to use a legacy version check the instructions in the corresponding branch readme. Each version is maintained in a different form due to versions issues so you should check the readme of the branch of the version you want to use.
In case you don't want to use pip or you want to use a freezed version of PyFladesk, just download the
__init__.py file from the
pyfladesk folder and place it in your project (change the name to pyfladesk.py), then you can follow the instructions below.
You just need to change two lines:
Add an import at the top:
from pyfladesk import init_gui
And wherever you run the app (
app.run) replace it with:
Then run your app as usual
from flask import Flask from pyfladesk import init_gui app = Flask(__name__) from routes import * if __name__ == '__main__': init_gui(app)
init_gui function has some optional parameters that you may find useful:
init_gui(application, port=5000, width=300, height=400, window_title="PyFladesk", icon="appicon.png", argv=None)
This avoids the need for the Python interpreter and the packages you use inside your project.
If you haven't already, install it with pip (if you use virtual environments you should install it inside it).
pip install pyinstaller
Some parameters to consider:
F- Bundles everything in a single file
w- Avoid displaying a console
--add-data- Add Folders to the directory/executable
Since Flask relies on a directory structure you should pass it to the folder, in the example case we only have two folders:
static, in case you use a database or some other directory structure you should adapt this.
Note: For more complex scenarios check the PyInstaller Docs
If we want everything in one executable file we can
pyinstaller -w -F --add-data "templates;templates" --add-data "static;static" app.py
pyinstaller -w -F --add-data "templates:templates" --add-data "static:static" app.py
Depending on the Linux version, you might need to install
sudo apt install libpython3.x-dev
This will create a folder
dist with our executable ready to be shipped. The executable will open the main window of our app.
If you still see
TemplateNotFound, you may try the following (From issue #9):
Define this in a helper script:
def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) return os.path.join(base_path, relative_path)
Include this at the top, under imports
if getattr(sys, 'frozen', False): template_folder = resource_path('templates') static_folder = resource_path('static') app = Flask(__name__, template_folder=template_folder, static_folder=static_folder) else: app = Flask(__name__)
Also from issue #9, in Windows 10 you may need to run this script:
pyinstaller -w -F --add-data "templates;templates" --add-data "static;static" app.py --path 'C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64'
Since Qt is quite big, your executables will be big too. The example app of this repository is 70 MB (69 MB of which are the Qt Component for displaying HTML). This is reasonable taking into account that we are shipping a self contain web browser. In case size is crucial, you can follow this suggestions
List of apps made by PyFladesk
Feel free to open issues and pull requests for new features and improvements. This is a guide for things that may be useful for the project: