#!/usr/bin/env python3
from nicegui import ui, wp
from contextlib import contextmanager
import inspect
from nicegui.elements.markdown import Markdown
from nicegui.elements.element import Element
import sys
from typing import Union
import docutils.core
import re
# add docutils css to webpage
wp.head_html += docutils.core.publish_parts('', writer_name='html')['stylesheet']
@contextmanager
def example(content: Union[Element, str]):
callFrame = inspect.currentframe().f_back.f_back
begin = callFrame.f_lineno
with ui.row(classes='flex w-full'):
if isinstance(content, str):
ui.markdown(content, classes='mr-8 w-4/12')
else:
doc = content.__init__.__doc__
if doc:
html = docutils.core.publish_parts(doc, writer_name='html')['html_body']
html = html.replace('
', '
', 1)
html = html.replace('', '
', 1)
html = Markdown.apply_tailwind(html)
ui.html(html, classes='mr-8 w-4/12')
else:
ui.label(content.__name__, 'h5')
with ui.card(classes='mt-12 w-2/12'):
yield
callFrame = inspect.currentframe().f_back.f_back
end = callFrame.f_lineno
code = inspect.getsource(sys.modules[__name__])
code = code.splitlines()[begin:end]
code = [l[4:] for l in code]
code.insert(0, '```python')
code.insert(1, 'from nicegui import ui')
code.append('```')
code = '\n'.join(code)
ui.markdown(code, classes='mt-12 w-5/12 overflow-auto')
with ui.row(classes='flex w-full'):
with open('README.md', 'r') as file:
content = file.read()
content = re.sub(r'(?m)^\demo paragraph in html')
with example(ui.button):
def button_increment():
global button_count
button_count += 1
button_result.set_text(f'pressed: {button_count}')
button_count = 0
ui.button('Button', on_click=button_increment)
button_result = ui.label('pressed: 0')
with example(ui.checkbox):
ui.checkbox('check me', on_change=lambda e: checkbox_state.set_text(e.value))
with ui.row():
ui.label('the checkbox is:')
checkbox_state = ui.label('False')
with example(ui.switch):
ui.switch('switch me', on_change=lambda e: switch_state.set_text("ON" if e.value else'OFF'))
with ui.row():
ui.label('the switch is:')
switch_state = ui.label('OFF')
with example(ui.slider):
slider = ui.slider(min=0, max=100, value=50, design='label')
ui.label().bind_text_from(slider.value)
with example(ui.input):
ui.input(
label='Text',
placeholder='press ENTER to apply',
on_change=lambda e: result.set_text('you typed: ' + e.value),
classes='w-full',
)
result = ui.label('')
with example(ui.number):
number_input = ui.number(label='Number', value=3.1415927, format='%.2f')
with ui.row():
ui.label('underlying value: ')
ui.label().bind_text_from(number_input.value)
with example(ui.radio):
radio = ui.radio(options=[1, 2, 3], value=1, design='inline')
ui.radio(options={1: 'A', 2: 'B', 3: 'C'}, value=1, design='inline').bind_value(radio.value)
with example(ui.toggle):
toggle = ui.toggle(options=[1, 2, 3], value=1)
ui.toggle(options={1: 'A', 2: 'B', 3: 'C'}, value=1).bind_value(toggle.value)
with example(ui.select):
with ui.row():
select = ui.select(options=[1, 2, 3], value=1, design='inline')
ui.select(options={1: 'One', 2: 'Two', 3: 'Three'}, value=1, design='inline').bind_value(select.value)
with example(ui.plot):
from matplotlib import pyplot as plt
import numpy as np
with ui.plot(figsize=(2.5, 1.8)):
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')
with example(ui.line_plot):
lines = ui.line_plot(n=2, limit=20, figsize=(2.5, 1.8)).with_legend(['sin', 'cos'], loc='upper center', ncol=2)
line_updates = 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()],
]), active=False)
ui.checkbox('active').bind_value(line_updates.active)