Skip to main content

On This Page

Building Interactive Web Apps with NiceGUI: A Technical Guide to Multi-Page Dashboards and Real-Time Systems

2 min read
Share

These articles are AI-generated summaries. Please check the original sources for full details.

How to Build a Fully Interactive Multi-Page NiceGUI Application with Real-Time Dashboard, CRUD Operations, File Upload, and Async Chat

NiceGUI allows Python developers to build full-stack web applications without writing HTML, CSS, or JavaScript. The system supports high-frequency updates, such as a live dashboard refreshing metrics every 1.0 second using ui.timer.

Why This Matters

Developers often struggle with the gap between static Python scripts and dynamic web frontends, which typically requires a separate JavaScript stack. NiceGUI bridges this technical divide by allowing state management and real-time visualization through ECharts and background threading, significantly reducing the overhead for engineers prototyping data-driven tools and interactive dashboards.

Key Insights

  • Real-time data visualization with ECharts integrates via the ui.echart component for sub-second dynamic updates.
  • Centralized state management is achieved using a dedicated State class to synchronize metrics and tasks across multiple pages.
  • Notebook-based deployment utilizes Python threading and socket libraries for background port allocation in Google Colab environments.
  • CRUD operations are optimized using the @ui.refreshable decorator to trigger targeted UI updates without full page reloads.
  • Asynchronous interaction is implemented with asyncio and ui.chat_message to manage real-time communication flows.

Working Examples

Implementation of a real-time dashboard with ECharts and a background timer for metric updates.

import threading, time, random, asyncio, socket
from nicegui import ui, events

class State:
    def __init__(self):
        self.metrics = {"users": 1247, "revenue": 8420, "orders": 53}
        self.series = [random.uniform(20, 80) for _ in range(20)]

state = State()

@ui.page("/")
def dashboard():
    with ui.column().classes("w-full p-6"):
        ui.label("Live Dashboard").classes("text-3xl font-bold")
        chart = ui.echart({
            "xAxis": {"type": "category"},
            "yAxis": {"type": "value"},
            "series": [{"data": list(state.series), "type": "line"}],
        }).classes("h-64 w-full")

        def tick():
            state.series.append(random.uniform(20, 80))
            state.series.pop(0)
            chart.options["series"][0]["data"] = list(state.series)
            chart.update()
        
        ui.timer(1.0, tick)

Practical Applications

  • Use case: Real-time monitoring systems utilizing ui.timer for 1-second interval metric updates. Pitfall: Excessive UI refreshes without state checks can lead to high client-side CPU usage.
  • Use case: Internal data entry tools with ui.input validation rules for profiles. Pitfall: Relying solely on client-side validation without secondary back-end verification logic.
  • Use case: Collaborative task management using @ui.refreshable for dynamic list updates. Pitfall: Inefficient state handling in large lists can cause UI lag during refresh operations.

References:

Continue reading

Next article

Building Unshielded Token Smart Contracts on Midnight Network

Related Content