Cython-based Python bindings for dear imgui - a bloat-free immediate mode graphical user interface library
—
Complete menu bar and popup menu functionality for creating application menus, context menus, and modal dialogs. The menu system provides hierarchical navigation and context-sensitive actions, while popups offer flexible overlay windows for various UI patterns.
Functions for creating application-wide menu bars at the top of the main window.
def begin_main_menu_bar() -> bool:
"""Begin main application menu bar. Returns True if menu bar is visible."""
def end_main_menu_bar() -> None:
"""End main application menu bar."""Functions for creating menu bars within individual windows.
def begin_menu_bar() -> bool:
"""Begin window menu bar. Returns True if menu bar is visible."""
def end_menu_bar() -> None:
"""End window menu bar."""Functions for creating hierarchical menu structures.
def begin_menu(label: str, enabled: bool = True) -> bool:
"""Begin a menu. Returns True if menu is open."""
def end_menu() -> None:
"""End the current menu."""
def menu_item(label: str, shortcut: str = "", selected: bool = False, enabled: bool = True) -> tuple[bool, bool]:
"""Menu item widget. Returns (clicked, selected_state)."""Functions for creating and managing popup windows and modal dialogs.
def open_popup(label: str, flags: int = 0) -> None:
"""Open popup with given label."""
def open_popup_on_item_click(label: str = None, popup_flags: int = 1) -> None:
"""Open popup when last item is clicked."""
def begin_popup(label: str, flags: int = 0) -> bool:
"""Begin popup window. Returns True if popup is open."""
def begin_popup_modal(title: str, visible: bool = None, flags: int = 0) -> tuple[bool, bool]:
"""Begin modal popup. Returns (is_open, visible_state)."""
def begin_popup_context_item(label: str = None, mouse_button: int = 1) -> bool:
"""Begin context popup for last item. Returns True if popup is open."""
def begin_popup_context_window(label: str = None, popup_flags: int = 1, also_over_items: bool = True) -> bool:
"""Begin context popup for window. Returns True if popup is open."""
def begin_popup_context_void(label: str = None, popup_flags: int = 1) -> bool:
"""Begin context popup for void area. Returns True if popup is open."""
def end_popup() -> None:
"""End the current popup."""
def is_popup_open(label: str, flags: int = 0) -> bool:
"""Check if popup with given label is open."""
def close_current_popup() -> None:
"""Close the current popup programmatically."""Constants for controlling popup behavior.
POPUP_NONE: int
POPUP_MOUSE_BUTTON_LEFT: int # Open with left mouse button
POPUP_MOUSE_BUTTON_RIGHT: int # Open with right mouse button (default)
POPUP_MOUSE_BUTTON_MIDDLE: int # Open with middle mouse button
POPUP_MOUSE_BUTTON_MASK: int
POPUP_MOUSE_BUTTON_DEFAULT: int
POPUP_NO_OPEN_OVER_EXISTING_POPUP: int # Don't open over existing popup
POPUP_NO_OPEN_OVER_ITEMS: int # Don't open over items
POPUP_ANY_POPUP_ID: int # Match any popup ID
POPUP_ANY_POPUP_LEVEL: int # Match any popup level
POPUP_ANY_POPUP: int # Match any popupimport imgui
# Main application menu bar
if imgui.begin_main_menu_bar():
if imgui.begin_menu("File"):
if imgui.menu_item("New", "Ctrl+N")[0]:
print("New file")
if imgui.menu_item("Open", "Ctrl+O")[0]:
print("Open file")
if imgui.menu_item("Save", "Ctrl+S")[0]:
print("Save file")
imgui.separator()
if imgui.menu_item("Exit", "Alt+F4")[0]:
print("Exit application")
imgui.end_menu()
if imgui.begin_menu("Edit"):
if imgui.menu_item("Undo", "Ctrl+Z")[0]:
print("Undo")
if imgui.menu_item("Redo", "Ctrl+Y")[0]:
print("Redo")
imgui.separator()
if imgui.menu_item("Copy", "Ctrl+C")[0]:
print("Copy")
if imgui.menu_item("Paste", "Ctrl+V")[0]:
print("Paste")
imgui.end_menu()
if imgui.begin_menu("View"):
show_demo = True
clicked, show_demo = imgui.menu_item("Show Demo", "", show_demo)
if clicked:
print(f"Show demo: {show_demo}")
imgui.end_menu()
imgui.end_main_menu_bar()# Menu bar within a window
if imgui.begin("Window with Menu", True, imgui.WINDOW_MENU_BAR):
if imgui.begin_menu_bar():
if imgui.begin_menu("Options"):
if imgui.menu_item("Option 1")[0]:
print("Option 1 selected")
if imgui.menu_item("Option 2")[0]:
print("Option 2 selected")
imgui.end_menu()
if imgui.begin_menu("Tools"):
if imgui.menu_item("Tool A")[0]:
print("Tool A activated")
if imgui.menu_item("Tool B")[0]:
print("Tool B activated")
imgui.end_menu()
imgui.end_menu_bar()
imgui.text("Window content goes here")
imgui.end()# Context menu on item
imgui.text("Right-click me for context menu")
if imgui.begin_popup_context_item("item_context"):
if imgui.menu_item("Action 1")[0]:
print("Action 1 from context menu")
if imgui.menu_item("Action 2")[0]:
print("Action 2 from context menu")
imgui.separator()
if imgui.menu_item("Delete", "Del")[0]:
print("Delete from context menu")
imgui.end_popup()
# Context menu on window
if imgui.begin_popup_context_window("window_context"):
imgui.text("Window Context Menu")
imgui.separator()
if imgui.menu_item("Window Action 1")[0]:
print("Window action 1")
if imgui.menu_item("Window Action 2")[0]:
print("Window action 2")
imgui.end_popup()
# Context menu on void area
if imgui.begin_popup_context_void("void_context"):
imgui.text("Void Context Menu")
imgui.separator()
if imgui.menu_item("Create New")[0]:
print("Create new from void")
imgui.end_popup()# Modal dialog example
show_modal = False
if imgui.button("Open Modal"):
show_modal = True
imgui.open_popup("Modal Dialog")
if show_modal:
opened, show_modal = imgui.begin_popup_modal("Modal Dialog", True)
if opened:
imgui.text("This is a modal dialog")
imgui.text("You must close it to continue")
imgui.separator()
if imgui.button("OK"):
show_modal = False
imgui.close_current_popup()
imgui.same_line()
if imgui.button("Cancel"):
show_modal = False
imgui.close_current_popup()
if opened:
imgui.end_popup()# Simple popup (non-modal)
if imgui.button("Open Popup"):
imgui.open_popup("simple_popup")
if imgui.begin_popup("simple_popup"):
imgui.text("This is a simple popup")
if imgui.button("Action 1"):
print("Action 1 clicked")
imgui.close_current_popup()
if imgui.button("Action 2"):
print("Action 2 clicked")
imgui.close_current_popup()
imgui.end_popup()# Nested menu structure
if imgui.begin_main_menu_bar():
if imgui.begin_menu("File"):
if imgui.begin_menu("Recent Files"):
if imgui.menu_item("file1.txt")[0]:
print("Open file1.txt")
if imgui.menu_item("file2.txt")[0]:
print("Open file2.txt")
imgui.separator()
if imgui.menu_item("Clear Recent")[0]:
print("Clear recent files")
imgui.end_menu()
imgui.separator()
if imgui.begin_menu("Export"):
if imgui.menu_item("Export as PDF")[0]:
print("Export as PDF")
if imgui.menu_item("Export as Image")[0]:
print("Export as Image")
imgui.end_menu()
imgui.end_menu()
imgui.end_main_menu_bar()# Menu items with dynamic states
file_saved = True
has_selection = False
if imgui.begin_main_menu_bar():
if imgui.begin_menu("Edit"):
# Disabled menu item
if imgui.menu_item("Cut", "Ctrl+X", False, has_selection)[0]:
print("Cut")
if imgui.menu_item("Copy", "Ctrl+C", False, has_selection)[0]:
print("Copy")
if imgui.menu_item("Paste", "Ctrl+V")[0]:
print("Paste")
imgui.separator()
# Menu item with checkmark
clicked, file_saved = imgui.menu_item("Auto Save", "", file_saved)
if clicked:
print(f"Auto save: {file_saved}")
imgui.end_menu()
imgui.end_main_menu_bar()# Custom popup positioning
if imgui.button("Custom Popup"):
# Open popup at specific position
imgui.open_popup("custom_positioned")
if imgui.begin_popup("custom_positioned"):
imgui.text("Custom positioned popup")
mouse_pos = imgui.get_mouse_pos()
imgui.text(f"Mouse: {mouse_pos[0]:.0f}, {mouse_pos[1]:.0f}")
if imgui.button("Close"):
imgui.close_current_popup()
imgui.end_popup()# Confirmation dialog pattern
show_confirmation = False
item_to_delete = None
# List of items with delete buttons
items = ["Item 1", "Item 2", "Item 3"]
for i, item in enumerate(items):
imgui.text(item)
imgui.same_line()
if imgui.small_button(f"Delete##{i}"):
item_to_delete = item
show_confirmation = True
imgui.open_popup("Delete Confirmation")
# Confirmation modal
if show_confirmation and item_to_delete:
opened, show_confirmation = imgui.begin_popup_modal("Delete Confirmation", True)
if opened:
imgui.text(f"Are you sure you want to delete '{item_to_delete}'?")
imgui.text("This action cannot be undone.")
imgui.separator()
if imgui.button("Yes, Delete"):
print(f"Deleting {item_to_delete}")
# Actually delete the item here
show_confirmation = False
item_to_delete = None
imgui.close_current_popup()
imgui.same_line()
if imgui.button("Cancel"):
show_confirmation = False
item_to_delete = None
imgui.close_current_popup()
if opened:
imgui.end_popup()Install with Tessl CLI
npx tessl i tessl/pypi-imgui