ImgUI 的 python 绑定

上一篇文章介绍了 Dear ImGui 的LUA绑定,让你在一分钟内感受到 Dear ImGui 的威力, 但是用 Lua 脚本的人不是那么多,这次我们使用 Python 脚本来完成类似的事情。

开工

参考pyimgui。 注意: 如果你直接用 pyimgui 的示例代码,你将什么也看不到,没有窗口,也没有出错提示。

打开终端, 安装依赖

1
pip install imgui[full] PyOpenGL PyOpenGL_accelerate

建立一个 python 脚本文件, test_imgui.py, 内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import imgui
from imgui.integrations.sdl2 import SDL2Renderer
import sdl2
import sdl2.ext
import OpenGL.GL as gl
from PIL import Image

sdl2.ext.init()

width, height = 800, 600
window = sdl2.ext.Window("ImGui SDL2 Example", size=(width, height), flags=sdl2.SDL_WINDOW_OPENGL)
gl_context = sdl2.SDL_GL_CreateContext(window.window)
gl.glClearColor(1, 1, 1, 1)

# 初始化 PyImGui
ctx = imgui.create_context()
imgui.get_io().display_size = width, height
imgui.get_io().fonts.get_tex_data_as_rgba32()

# 创建 SDL2Renderer 时,传递 SDL_Window 实例,而不是窗口对象
renderer = SDL2Renderer(window.window)

running = True
while running:
    for event in sdl2.ext.get_events():
        if event.type == sdl2.SDL_QUIT:
            running = False
    
    imgui.new_frame()               # 开始 ImGui 帧
    imgui.text("Hello, ImGui!")     # 在这里添加你的 ImGui 绘制代码    
    imgui.render()                  # 结束 ImGui 帧
    drawdata = imgui.get_draw_data()
    
    # 清空屏幕
    gl.glViewport(0, 0, width, height)
    gl.glClear(gl.GL_COLOR_BUFFER_BIT)    
    renderer.render(drawdata)               # 渲染 ImGui 到屏幕
    sdl2.SDL_GL_SwapWindow(window.window)   # 刷新窗口
    
renderer.shutdown()
imgui.destroy_context(ctx)
sdl2.SDL_GL_DeleteContext(gl_context)
sdl2.ext.quit()

运行脚本

1
python test_imgui.py

你将会看到如下图的图形窗口。 imgui_py.png

updatedupdated2024-02-282024-02-28