Mutated Properties - a simple HTML5 property-configuration UI, autogenerated from your classes.
It's great if you need a quick'n'dirty UI with minimal effort and without changing much of the existing codebase. Mutaprops also thrive on headless systems when usual UI solutions like tkinter doesn't make sense.
However, the customization possibilities are limited, so if you are looking for some framework for building a full-fledged attractive GUI, better look elsewhere.
- Generate a self-documented web UI directly from your objects with simple decorators
- UI state automatically updated with object state changes (through websockets)
- Supports multiple UI sessions on the same object, synchronized through websockets
- Supports clustering of UI's from multiple machines
- UI look and feel can be customized with your own stylesheet
- Add any widget you like with direct HTML support
- HTML5 log console capturing all your Python logging
- Asyncio support (and also a requirement ;))
Imagine a normal Python class:
class Hoovercraft:
MAX_EELS = 40
def __init__(self, number_of_eels=20, speed=0, direction='North'):
self._eel_count = number_of_eels
self._speed = speed
self._direction = direction
self._engine_running = False
self._steering_locked = True
@property
def eels(self):
return self._eel_count
@eels.setter
def eels(self, value):
self._eel_count = value
if self._eel_count >= self.MAX_EELS:
logger.warning("The hoovercraft is full of eels!")
def drop_all_eels(self):
self.eels = 0
logger.info("Eels are goooone!")
Now, to turn this into an UI, one just has to decorate it like this:
from mutaprops import *
@mutaprop_class("Hoovercraft UI")
class Hoovercraft:
MAX_EELS = 40
def __init__(self, number_of_eels=20, speed=0, direction='North'):
self._eel_count = number_of_eels
self._speed = speed
self._direction = direction
self._engine_running = False
self._steering_locked = True
@mutaproperty("Number of eels", MutaTypes.INT, min_val=0,
max_val=MAX_EELS)
def eels(self):
return self._eel_count
@eels.setter
def eels(self, value):
self._eel_count = value
if self._eel_count >= self.MAX_EELS:
logger.warning("The hoovercraft is full of eels!")
@mutaprop_action("Drop all eels!")
def drop_all_eels(self):
self.eels = 0
logger.info("Eels are goooone!")
And then run it like this:
if __name__ == '__main__':
test = Hoovercraft()
test.muta_init("Hoovercraft instance #1")
man = HttpMutaManager("Hoovercraft manager", proxy_log=logger)
man.add_object(test)
man.run(port=9000)
Et voila, here's the UI:
The examples/
folder contains several other examples:
- simple_example.py is the extension of the example above, including more
data types and also shows how to work with docstrings and
mutasources
- advanced_example.py demonstrates grouping of parameters, style customizations, raw HTML features and asyncio integration.
The complete documentation is available at https://mutaprops.readthedocs.io
Simple explanation how to use the UI is here.
The default logo created with the Chlorinar font.
The JavaScript frontend created with the fantastic Vue.js.
The widgets and styling are based on Bootstrap 3.
The toggle widget is the Bootstrap toggle.
Hoovercraft logo used in advanced_example.py was created by Theresa Stoodley from the Noun Project. Licensed under Creative Commons 3.0 license.
This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.