refreshable_documentation.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from nicegui import ui
  2. from . import doc
  3. @doc.demo(ui.refreshable)
  4. def main_demo() -> None:
  5. import random
  6. numbers = []
  7. @ui.refreshable
  8. def number_ui() -> None:
  9. ui.label(', '.join(str(n) for n in sorted(numbers)))
  10. def add_number() -> None:
  11. numbers.append(random.randint(0, 100))
  12. number_ui.refresh()
  13. number_ui()
  14. ui.button('Add random number', on_click=add_number)
  15. @doc.demo('Refreshable UI with parameters', '''
  16. Here is a demo of how to use the refreshable decorator to create a UI that can be refreshed with different parameters.
  17. ''')
  18. def refreshable_with_parameters():
  19. from datetime import datetime
  20. import pytz
  21. @ui.refreshable
  22. def clock_ui(timezone: str):
  23. ui.label(f'Current time in {timezone}:')
  24. ui.label(datetime.now(tz=pytz.timezone(timezone)).strftime('%H:%M:%S'))
  25. clock_ui('Europe/Berlin')
  26. ui.button('Refresh', on_click=clock_ui.refresh)
  27. ui.button('Refresh for New York', on_click=lambda: clock_ui.refresh('America/New_York'))
  28. ui.button('Refresh for Tokyo', on_click=lambda: clock_ui.refresh('Asia/Tokyo'))
  29. @doc.demo('Refreshable UI for input validation', '''
  30. Here is a demo of how to use the refreshable decorator to give feedback about the validity of user input.
  31. ''')
  32. def input_validation():
  33. import re
  34. pwd = ui.input('Password', password=True, on_change=lambda: show_info.refresh())
  35. rules = {
  36. 'Lowercase letter': lambda s: re.search(r'[a-z]', s),
  37. 'Uppercase letter': lambda s: re.search(r'[A-Z]', s),
  38. 'Digit': lambda s: re.search(r'\d', s),
  39. 'Special character': lambda s: re.search(r"[!@#$%^&*(),.?':{}|<>]", s),
  40. 'min. 8 characters': lambda s: len(s) >= 8,
  41. }
  42. @ui.refreshable
  43. def show_info():
  44. for rule, check in rules.items():
  45. with ui.row().classes('items-center gap-2'):
  46. if check(pwd.value or ''):
  47. ui.icon('done', color='green')
  48. ui.label(rule).classes('text-xs text-green strike-through')
  49. else:
  50. ui.icon('radio_button_unchecked', color='red')
  51. ui.label(rule).classes('text-xs text-red')
  52. show_info()
  53. @doc.demo('Refreshable UI with reactive state', '''
  54. You can create reactive state variables with the `ui.state` function, like `count` and `color` in this demo.
  55. They can be used like normal variables for creating UI elements like the `ui.label`.
  56. Their corresponding setter functions can be used to set new values, which will automatically refresh the UI.
  57. ''')
  58. def reactive_state():
  59. @ui.refreshable
  60. def counter(name: str):
  61. with ui.card():
  62. count, set_count = ui.state(0)
  63. color, set_color = ui.state('black')
  64. ui.label(f'{name} = {count}').classes(f'text-{color}')
  65. ui.button(f'{name} += 1', on_click=lambda: set_count(count + 1))
  66. ui.select(['black', 'red', 'green', 'blue'],
  67. value=color, on_change=lambda e: set_color(e.value))
  68. with ui.row():
  69. counter('A')
  70. counter('B')
  71. doc.reference(ui.refreshable)