虽然对 imgui 接触有一段时间了,但还是第一次介绍imgui,imgui 是一个比较优异的轻量级界面渲染项目,其理论上做到了模块的方式去编程界面, 比qt上手容易很多, 环境搭建和项目的编译也比较好, 比qt要简单很多, 再结合python,效果更加好了。
上手imgui直接看官方 demo 代码,底层渲染有 gl,direct,sdl 等实现。
渲染速度非常快, 社区维护也非常活跃。
再结合python特性,pyimgui 项目可以说将界面编程变成了一个上手快,效果快,调试方便等特点。
imgui 项目采用了大量的push, pop方法来做属性的配置, 我们可以是用python在做,比如颜色。
class ncolor:
def __init__(self, rgba=[], wtype=[]):
self.rgba = rgba
self.wtype = wtype
pass
def __exit__(self, exc_t, exc_v, trace):
if len(self.rgba) == 0: return
imgui.pop_style_color(len(self.rgba))
def __enter__(self):
for i, t in enumerate(self.wtype):
imgui.push_style_color(t, *(self.rgba[i]))
使用的时候,直接
with ncolor([colorsys.hsv_to_rgb(.9, .6, .6)],[imgui.COLOR_TEXT]):
imgui.text('abc')
当然,中文也是界面处理的一个难点,反正我不清楚, 我折腾了三四天,总算找到眉目。
# -*- coding: utf-8 -*-
from __future__ import absolute_import
import pyglet
from pyglet import gl
from testwindow import show_test_window
import imgui
# Note that we could explicitly choose to use PygletFixedPipelineRenderer
# or PygletProgrammablePipelineRenderer, but create_renderer handles the
# version checking for us.
from imgui.integrations.pyglet import create_renderer
def main():
window = pyglet.window.Window(width=1280, height=720, resizable=True)
gl.glClearColor(1, 1, 1, 1)
imgui.create_context()
impl = create_renderer(window)
io = imgui.get_io()
# a.ttf 是包含中文编码字符实现的ttf文件,
chinese_font = io.fonts.add_font_from_file_ttf('a.ttf',20,io.fonts.get_glyph_ranges_chinese_full())
# 注意这一句, 这里会去加载字符,没有会报错
impl.refresh_font_texture()
def update(dt):
imgui.new_frame()
if imgui.begin_main_menu_bar():
if imgui.begin_menu("File", True):
clicked_quit, selected_quit = imgui.menu_item(
"Quit", 'Cmd+Q', False, True
)
if clicked_quit:
exit(1)
imgui.end_menu()
imgui.end_main_menu_bar()
show_test_window()
# 这里是中文的样例
imgui.push_font(chinese_font)
imgui.begin('韵abcd',True)
imgui.pop_font()
imgui.end()
def draw(dt):
update(dt)
window.clear()
imgui.render()
impl.render(imgui.get_draw_data())
pyglet.clock.schedule_interval(draw, 1/120.)
pyglet.app.run()
impl.shutdown()
if __name__ == "__main__":
main()
总的来说,imgui 项目对界面编程相对qt更加友好,更加贴近底层的封装, 欢迎大家尝试交流。