Freezing Flexx apps

Flexx needs special care when freezing, because it needs access to the Python source code in order to compile it to JavaScript.

The easy way

There is experimental support to make freezing very easy:

from flexx import flx

class Example(flx.Widget):
    def init(self):
        flx.Button(text="Hi there")

if __name__ == "__main__":
    app = flx.App(Example)
    app.freeze("~/Desktop/flexx_apps")

The more explicit way

The above approach does most of the magic behind the scenes. For more control, you can also use a more explicit approach.

First, create a script that represents your application entry point. It is important that this script does not define any new Flexx widgets. It should look something like this:

# Install hook so we we can import modules from source when frozen.
from flexx.util import freeze
freeze.install()

# Run your app as usual
from flexx import flx
from my_module import MyWidget
app = flx.App(MyWidget)
app.launch("firefox-app")
flx.run()

Next, use PyInstaller as usual to create an app directory. Consider using --exclude-module numpy (PyInstaller thinks that Flexx needs Numpy, but this not the case).

Next, copy the source code of the modules that define Flexx widgets. If you run PyInstaller from a script (using PyInstaller.__main__.run()) then you can combine it.

from flexx.util import freeze

freeze.copy_module("flexx", app_dir)  # always
freeze.copy_module("flexxamples", app_dir)  # used something from here?
freeze.copy_module("my_module", app_dir)

That should be it!