|
4 ani în urmă | |
---|---|---|
.github | 4 ani în urmă | |
.vscode | 4 ani în urmă | |
nicegui | 4 ani în urmă | |
sceenshots | 4 ani în urmă | |
.gitignore | 4 ani în urmă | |
Dockerfile | 4 ani în urmă | |
LICENSE | 4 ani în urmă | |
README.md | 4 ani în urmă | |
api_reference.py | 4 ani în urmă | |
docker-compose.yml | 4 ani în urmă | |
docker.sh | 4 ani în urmă | |
examples.py | 4 ani în urmă | |
nicegui.code-workspace | 4 ani în urmă | |
poetry.lock | 4 ani în urmă | |
pyproject.toml | 4 ani în urmă |
We like Streamlit but find it does to much magic when it comes to state handling. In search for an alernative nice library to write simple graphical user interfaces in Python we discovered justpy. While too "low-level-html" for our daily usage it provides a great basis for "NiceGUI".
NiceGUI is intended to be used for small scripts and user interfaces with a very limited user base. Custom "Smart-Home Control" solutions or "Robotics" for example. It's also helpful for development like tweaking/configuring a machine learning training or tuning motor controllers.
python3 -m pip install nicegui
Write your nice GUI in a file main.py
:
from nicegui import ui
ui.label('Hello NiceGUI!')
ui.button('BUTTON', on_click=lambda: print('button was pressed'))
Launch it with:
python3 main.py
Note: The script will automatically reload the GUI if you modify your code.
See main.py for an extensive example what you can do with NiceGUI.
Button
, Checkbox
and Switch
require a name which is displayed as their label and a callback. The callback can have an optional event
parameter which provides informations like sender and value:
ui.button('Button', on_click=lambda: result.set_text('Button: pressed'))
ui.checkbox('Checkbox', on_change=lambda e: result.set_text(f'checkbox: {e.value}'))
ui.switch('Switch', on_change=lambda e: result.set_text(f'switch: {e.value}'))
result = ui.label('please interact', typography='bold')
Use ui.input
to receive text and ui.number
for explicit number input.
ui.input(label='Text', on_change=lambda e: result.set_text(e.value))
ui.number(label='Number', format='%.2f', on_change=lambda e: result.set_text(e.value))
result = ui.label('please type', typography='bold')
Pre-fill ui.input
with the text
property and ui.number
with value
.
NiceGUI use the Quasar Framework and hence has their full design power. Each NiceGUI element provides a design
property which content is passed as props the Quasar component:
ui.radio(['x', 'y', 'z'], design='inline color=green')
ui.button(icon='touch_app', design='outline round')
Have a look at the Quasar documentation for all styling "props".
One major drive behind the creation of NiceGUI was the necessity to have an simple approach to update the interface in regular intervals. For example to show a graph with incomming measurements (see plots below):
clock = ui.label()
ui.timer(interval=0.1, callback=lambda: clock.set_text(datetime.now().strftime("%X")))
With an optional third parameter once=True
the callback
is once executed after an delay specified by interval
. Otherwise the callback
is run repeatedly.
To render a simple plot you create a new context and call the neccessary Matplotlib functions:
from nicegui import ui
from matplotlib import pyplot as plt
import numpy as np
with ui.plot():
x = np.linspace(0.0, 5.0)
y = np.cos(2 * np.pi * x) * np.exp(-x)
plt.plot(x, y, '-')
plt.xlabel('time (s)')
plt.ylabel('Damped oscillation')
To update a plot in regular intervals, have look at main.py.
To simplify live updating line plots even more, NiceGUI provides ui.line_plot
with useful parameters and a push
method:
lines = ui.line_plot(n=2, limit=20).with_legend(['sin', 'cos'], loc='upper center', ncol=2)
ui.timer(0.1, lambda: lines.push([datetime.now()], [
[np.sin(datetime.now().timestamp()) + 0.02 * np.random.randn()],
[np.cos(datetime.now().timestamp()) + 0.02 * np.random.randn()],
]))