Skip to content

Commit

Permalink
Python backends: add an example using wgpu (WebGPU for Python)
Browse files Browse the repository at this point in the history
https://github.com/pygfx/wgpu-py provides a nice way to run imgui apps using Python + WebGPU.
  • Loading branch information
pthom committed Feb 19, 2025
1 parent beea43b commit 8b2a724
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 1 deletion.
6 changes: 5 additions & 1 deletion bindings/imgui_bundle/demos_cpp/demo_immapp_launcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,11 @@ std::function<void()> makeGui()
"Python: how to use ImGui with pyglet using a *full python* backend",
true
},

DemoApp{
"example_python_backend_wgpu",
"Python: how to use ImGui with wgpu (WebGPU for Python)",
true,
},
};
std::string demoPythonBackendFolder = DemoPythonFolder() + + "/../python_backends/examples";
DemoAppTable demoAppTable(
Expand Down
5 changes: 5 additions & 0 deletions bindings/imgui_bundle/demos_python/demo_immapp_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@ def make_gui() -> GuiFunction:
"Python: how to use ImGui with pyglet using a *full python* backend",
is_python_backend_demo=True,
),
DemoApp(
"example_python_backend_wgpu",
"Python: how to use ImGui with wgpu (WebGPU for Python)",
is_python_backend_demo=True,
),
]

this_dir = os.path.dirname(__file__)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# wgpu (see https://github.com/pygfx/wgpu-py and https://wgpu-py.readthedocs.io/en/stable/)
# provides a Python implementation of WebGPU together with
# an easy-to-use interface to Dear ImGui Bundle!
#
# See more examples in the wgpu-py repository here:
# https://github.com/pygfx/wgpu-py/tree/main/examples
# (look for examples whose name starts with "imgui_")
#
# Requirements: install wgpu with `pip install wgpu`

import wgpu
import sys
from imgui_bundle import imgui, imgui_ctx
from wgpu.gui.auto import WgpuCanvas, run
from wgpu.utils.imgui import ImguiRenderer


# Create a canvas to render to
canvas = WgpuCanvas(title="imgui", size=(640, 480))

# Create a wgpu device
adapter = wgpu.gpu.request_adapter_sync(power_preference="high-performance")
device = adapter.request_device_sync()

app_state = {"text": "Hello, World\nLorem ipsum, etc.\netc."}
imgui_renderer = ImguiRenderer(device, canvas)


def update_gui():
imgui.new_frame()
if imgui.begin_main_menu_bar():
if imgui.begin_menu("File", True):
clicked_quit, _ = imgui.menu_item("Quit", "Cmd+Q", False, True)
if clicked_quit:
sys.exit(0)

imgui.end_menu()
imgui.end_main_menu_bar()

imgui.set_next_window_size((300, 0), imgui.Cond_.appearing)
imgui.set_next_window_pos((0, 20), imgui.Cond_.appearing)

imgui.begin("Custom window", None)
imgui.text("Example Text")

if imgui.button("Hello"):
print("World")

_, app_state["text"] = imgui.input_text_multiline(
"Edit", app_state["text"], imgui.ImVec2(200, 200)
)
io = imgui.get_io()
imgui.text(
f"""
Keyboard modifiers:
{io.key_ctrl=}
{io.key_alt=}
{io.key_shift=}
{io.key_super=}"""
)

if imgui.button("Open popup"):
imgui.open_popup("my popup")
with imgui_ctx.begin_popup_modal("my popup") as popup:
if popup.visible:
imgui.text("Hello from popup!")
if imgui.button("Close popup"):
imgui.close_current_popup()

imgui.end()

imgui.end_frame()
imgui.render()

return imgui.get_draw_data()


# set the GUI update function that gets called to return the draw data
imgui_renderer.set_gui(update_gui)


def draw_frame():
imgui_renderer.render()
canvas.request_draw()


if __name__ == "__main__":
canvas.request_draw(draw_frame)
run()

0 comments on commit 8b2a724

Please sign in to comment.