CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-imgui

Cython-based Python bindings for dear imgui - a bloat-free immediate mode graphical user interface library

Pending
Overview
Eval results
Files

menus.mddocs/

Menus and Popups

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.

Capabilities

Main Menu Bar

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."""

Window 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."""

Menu Management

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)."""

Popup Management

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."""

Popup Flags

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 popup

Usage Examples

Main Menu Bar

import 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()

Window 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 Menus

# 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 Dialogs

# 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

# 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 Menus

# 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()

Conditional Menu Items

# 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()

Popup with Custom Positioning

# 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

# 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

docs

drawing.md

index.md

input.md

integrations.md

layout.md

menus.md

styling.md

tables.md

tabs.md

widgets.md

windows.md

tile.json