Works everywhere¶
Cross-platform in C++ and Python: Works on Windows, Linux, macOS, iOS, Android, and WebAssembly!
Web ready: Develop full web applications, in C++ via Emscripten; or in Python thanks to ImGui Bundle’s integration within Pyodide.
First class support for Python¶
Python Bindings: Using Dear ImGui Bundle in Python is extremely easy and productive.
Well documented Python bindings and stubs: The Python bindings stubs reflect the C++ API and documentation, serving as a reference and aiding autocompletion in your IDE. See for example the stubs for imgui, and for hello_imgui.
Use it to create standalone apps (on Windows, macOS, and Linux), or to add interactive UIs to your notebooks. Deploy your apps on the web with ease, using Pyodide.
Easy to use & well documented¶
The Immediate Mode GUI (IMGUI) paradigm is simple and powerful, letting you focus on the creative aspects of your projects.
Easy to use, yet very powerful: Start your first app in 3 lines.
Interactive Demos and Documentation: Quickly get started with our interactive manual and demos that showcase the capabilities of the pack. Read or copy-paste the source code (Python and C++) directly from the interactive manual!
Always up-to-date¶
Auto-generated bindings: Python bindings are automatically generated, ensuring they stay synchronized with C++ APIs.
Version tracking: ImGui Bundle version numbers match Dear ImGui releases (e.g., ImGui Bundle 1.91.x includes Dear ImGui 1.91.x). Updates typically follow within days of upstream releases.
High performance¶
Fast: Rendering is done via OpenGL (or any other renderer you choose), through native code.
Comprehensive Library Integration¶
Dear ImGui Bundle isn’t just ImGui - it’s a curated ecosystem with more than 20 integrated libraries, where Each library is:
Available in Python and C++ with consistent APIs
Always up to date, since Python bindings are autogenerated
Documented with interactive examples
Core Libraries¶
Dear ImGui : Bloat-free Graphical User interface with minimal dependencies
ImGui Test Engine : Dear ImGui Tests & Automation Engine
Hello ImGui : cross-platform Gui apps with the simplicity of a “Hello World” app
Plotting & Visualization¶
ImPlot : Immediate Mode Plotting
ImPlot3D : Immediate Mode 3D Plotting
ImmVision : Immediate image debugger and insights
imgui_tex_inspect : A texture inspector tool for Dear ImGui
Text Editing & Markdown¶
ImGuiColorTextEdit : Colorizing text editor for ImGui
imgui_md : Markdown renderer for Dear ImGui using MD4C parser
Tools¶
ImGuizmo : Immediate mode 3D gizmo for scene editing
imgui-node-editor : Node Editor built using Dear ImGui
NanoVG : Antialiased 2D vector drawing library on top of OpenGL
Widgets¶
ImFileDialog : A file dialog library for Dear ImGui
portable
-file -dialogs : OS native file dialogs library (C++11, single-header) imgui-knobs : Knobs widgets for ImGui
imspinner : Set of nice spinners for imgui
imgui_toggle : A toggle switch widget for Dear ImGui
ImCoolBar : A Cool bar for Dear ImGui
imgui
-command -palette : A Sublime Text or VSCode style command palette in ImGui
Common Questions¶
Is It Interesting for Developers?¶
Absolutely yes, for several reasons:
1. Joy of Use¶
The immediate-mode paradigm is genuinely refreshing:
# Your code directly expresses intent
if imgui.button("Click Me"):
do_something()This is more readable and maintainable than callback spaghetti or complex widget trees.
2. Rapid Development¶
From zero to functional UI is remarkably fast:
No UI designer needed
No XML/JSON layouts to maintain
Changes appear immediately
Easy to iterate
3. Power When You Need It¶
The framework scales from simple to complex:
Start with a simple window and buttons
Add docking and multiple windows
Incorporate 3D visualization
Build node-based editors
Create custom widgets
All while maintaining code clarity.
4. Cross-Platform Reality¶
The cross-platform support actually works:
Same code runs on Windows, macOS, Linux
WebAssembly with Python runtime (!!)
No platform-specific hacks needed
Mobile support (iOS, Android) is real (in C++)
5. Active Community¶
Dear ImGui itself has 60k+ stars and is used in AAA games
Dear ImGui Bundle is based on Dear ImGui and adds comprehensive Python support
1k+ stars
Regular updates and maintenance, keeping up with Dear ImGui upstream
“Isn’t rebuilding the UI every frame slow?”¶
No! Because:
Widget calls are cheap (just generate drawing commands)
Actual rendering is GPU-accelerated
Typical frame times: < 1ms for most UIs
Easily achieves 60+ FPS even with complex interfaces
“How’s the Python performance?”¶
Excellent! Because:
Each widget call crosses to C++ once per frame
Heavy lifting (rendering) is in C++
Python overhead is < 0.5ms per frame typically
Real bottleneck is usually your application logic, not the GUI
“Does it work on the web?”¶
Yes, impressively!
C++ → Emscripten → WebAssembly
Python → Pyodide → WebAssembly (!!)
Full Python runtime in browser
Native-speed rendering via WebGL
Check the interactive manual: traineq
.org /ImGuiBundle
Comparison with Alternatives¶
The examples below implement the same “fruit picker” app.

Compare the code styles:
12 lines – True immediate mode: UI declaration is the event handler
from imgui_bundle import imgui, hello_imgui
selected_idx = 0
items = ["Apple", "Banana", "Cherry"]
def gui():
global selected_idx
imgui.text("Choose a fruit:")
_changed, selected_idx = imgui.list_box("##fruits", selected_idx, items)
imgui.text(f"You selected: {items[selected_idx]}")
hello_imgui.run(gui, window_title="Fruit Picker")Strengths: Simplest code, real-time capable, runs on desktop + web (Pyodide), 20+ integrated libraries, full C++ support
Best for: Tools, visualization, games, scientific apps
31 lines – Retained mode with class hierarchy and signals/slots
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QListWidget
items = ["Apple", "Banana", "Cherry"]
class FruitPicker(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout()
self.label = QLabel("Choose a fruit:")
self.list_widget = QListWidget()
self.list_widget.addItems(items)
self.result_label = QLabel(f"You selected: {items[0]}")
self.list_widget.currentRowChanged.connect(self.on_selection_changed)
layout.addWidget(self.label)
layout.addWidget(self.list_widget)
layout.addWidget(self.result_label)
self.setLayout(layout)
def on_selection_changed(self, index):
self.result_label.setText(f"You selected: {items[index]}")
app = QApplication([])
window = FruitPicker()
window.show()
app.exec()Qt strengths: More widgets, Qt Designer, larger ecosystem, rich text, accessibility, native look
ImGui Bundle strengths: Simpler code, real-time, lighter weight, scientific viz, easier cross-compilation
Qt is Best for: Traditional business apps, enterprise software
29 lines – ImGui-based but with retained-mode API and callbacks
import dearpygui.dearpygui as dpg
items = ["Apple", "Banana", "Cherry"]
dpg.create_context()
def on_selection_changed(sender, app_data):
dpg.set_value("result_label", f"You selected: {app_data}")
with dpg.window(tag="Primary Window", label="Fruit Picker"):
dpg.add_text("Choose a fruit:")
dpg.add_listbox(items=items, callback=on_selection_changed, num_items=len(items))
dpg.add_text("You selected: ", tag="result_label")
dpg.create_viewport(title='Fruit Picker', width=400, height=300)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("Primary Window", True)
dpg.start_dearpygui()
dpg.destroy_context()DearPyGui strengths: Familiar retained-mode API, large user base, good reputation
ImGui Bundle strengths: True immediate mode, more libraries (~20), C++ support, Pyodide web support
DearPyGui is Best for: Developers who prefer retained-mode patterns
15 lines – Web-based with callbacks
from nicegui import ui
selected_idx = -1
items = ["Apple", "Banana", "Cherry"]
def on_selection_change(e):
global selected_idx
selected_idx = items.index(e.value)
selection_label.text = f"You selected: {e.value}"
ui.label("Choose a fruit:")
dropdown = ui.select(options=items, value=items[0], on_change=on_selection_change)
selection_label = ui.label(f"You selected: {items[0]}")
ui.run(title="Fruit Picker")NiceGUI strengths: Web-native, modern UI, easy deployment, familiar web paradigm, reactive
ImGui Bundle strengths: Native performance, desktop-native, offline capable, advanced widgets, lower latency
NiceGUI is Best for: Web-first apps, internal dashboards, CRUD interfaces
18 lines – Declarative blocks with event wiring
import gradio as gr
items = ["Apple", "Banana", "Cherry"]
selected_item = items[0]
def on_selection_change(choice):
global selected_item
selected_item = choice
return f"You selected: {choice}"
with gr.Blocks() as demo:
gr.Markdown("# Fruit Picker")
gr.Markdown("Choose a fruit:")
dropdown = gr.Dropdown(choices=items, value=items[0], label="Choose a fruit")
output = gr.Textbox(value=f"You selected: {items[0]}", label="Selection", interactive=False)
dropdown.change(fn=on_selection_change, inputs=dropdown, outputs=output)
demo.launch()Gradio strengths: Web-native, ML-focused, Hugging Face integration, easy sharing, pre-built media components
ImGui Bundle strengths: Native performance, desktop-native, stateful apps, professional tools, flexibility
Gradio is Best for: ML model demos, Hugging Face Spaces, sharing with non-technical users