bimpy-python的瓶装imgui

bimp的Python项目详细描述


bimpy-python的捆绑imgui

Downloads:Downloads
Build status:Build
License:License

bimpy是一个python模块,它提供对dear imgui的绑定,并作为与glfwgl3w捆绑在一起的自包含包分发。

功能:

  • 允许使用python轻松创建即时模式ui。该api尽可能地与原始的亲爱的imgui保持接近。
  • bimpy已经具备创建window/opengl上下文所需的所有功能,并向用户隐藏这些详细信息。
  • bimpy支持多个上下文并允许创建多个窗口。
  • bimpy适用于windows、gnu linux和macos。
  • bimpy没有依赖项,可以从源代码轻松构建。建筑只依赖于装饰。
  • bimpy可以显示来自ndarrays、pil图像、numpy数组等的图像。

你好,我是bimpy的世界:

importbimpyctx=bimpy.Context()ctx.init(600,600,"Hello")str=bimpy.String()f=bimpy.Float();while(notctx.should_close()):withctx:bimpy.text("Hello, world!")ifbimpy.button("OK"):print(str.value)bimpy.input_text('string',str,256)bimpy.slider_float("float",f,0.0,1.0)
hello-world

显示图像:

importbimpyfromPILimportImagectx=bimpy.Context()ctx.init(800,800,"Image")image=Image.open("test.png")im=bimpy.Image(image)while(notctx.should_close()):withctx:bimpy.text("Display PIL Image")bimpy.image(im)
hello-world

类似地,可以显示具有2维、3维(2、3或4通道)类型np.uint8的numpy数组。 这里有更多的例子:https://github.com/podgorskiy/bimpy/blob/master/examples/image.py

安装

由于包不具有依赖项,因此安装很容易:

pip install bimpy

或者您可以从源代码构建和安装:

python setup.py install

所有C/C++源代码都是用distutils构建的。你需要的是一个带有C++ 11支持的编译器。

使用Python2.7的Windows用户可能会遇到问题,因为在Windows上,Python2.7使用的是不支持C++11的MSVC9.0。但是,您仍然可以使用下面的命令:用较新的MSVC(例如MSVC 14,即Visual C++ 2015)来构建它:

call "%VS140COMNTOOLS%\VsDevCmd.bat"setVS90COMNTOOLS=%VS140COMNTOOLS%
python setup.py install

如果构建在Linux上,则需要以下依赖项:

sudo apt-get install mesa-common-dev libxi-dev libxinerama-dev libxrandr-dev libxcursor-dev

如何使用?

简介

^ {STR 1 } $bimy 是对{a1}的Python绑定,并尝试匹配C++ API。此外,它还具有一些创建窗口的附加功能和一些其他差异。

它对来自dear imgui的大多数函数都有绑定。所有函数都从camelcase重命名为snake_case,这在python中更为常见。例如,ImGui::InputText映射到bimpy.input_text

上下文和窗口

首先,您需要导入bimpy

importbimpy

dear imgui不同,bimpy不具有全局状态(dear imgui默认具有全局状态,但可以选择不具有全局状态)。所以,你需要创建一个上下文。

ctx=bimpy.Context(width,height,name)

其中整数widthheight指定窗口的大小,字符串name是窗口的标题。

bimpy的api的所有调用都必须在内,并将语句应用于上下文对象:

withctx:bimpy.text("Hello, world!")

而且每帧只能有一个带语句的应用于上下文对象。

或者,第二个选项是在所有api调用之前手动调用ctx.new_frame(),然后再调用ctx.render()

ctx.new_frame()bimpy.text("Hello, world!")ctx.render()

对于多个窗口,可以有多个context对象,但是api不是线程安全的。

变量

所有提供用户输入的imguiapi(例如inputtextsliderfloat等)都通过对变量的引用来修改变量。然而,在python中,整数、浮点数和字符串等对象总是按值传递的。因此,bimpy提供了特殊的包装器,允许通过引用传递这些变量。

例如,要使用slider_float,首先需要创建一个变量来保存状态:

f=bimpy.Float();

您可以通过以下方式访问该值:f.value

使用它使用slider_float只需将其传递给该函数:

bimpy.slider_float("float slider",f,0.0,1.0)

所有提供多个输入的imgui输入函数,如sliderfloat2sliderint4inputt3等都映射到等效函数,但您需要列出参数列表中的所有变量,而不是传递变量数组:

f1=bimpy.Float();f2=bimpy.Float();f3=bimpy.Float();while(notctx.should_close()):withctx:bimpy.slider_float3("float",f1,f2,f3,0.0,1.0)

绘图命令

某些绘图命令已公开。与C++API相比,暴露的函数不是^ {STR 1 } $ IpRuxList的方法,而是全局函数。所有绘图函数都应该在窗口的begin/end调用内调用。

公开的绘图功能列表:

add_circle(centre:_bimpy.Vec2,radius:float,col:int,num_segments:int=12,thickness:float=1.0)->Noneadd_circle_filled(centre:_bimpy.Vec2,radius:float,col:int,num_segments:int=12)->Noneadd_line(a:_bimpy.Vec2,b:_bimpy.Vec2,col:int,thickness:float=1.0)->Noneadd_quad(a:_bimpy.Vec2,b:_bimpy.Vec2,c:_bimpy.Vec2,d:_bimpy.Vec2,col:int,thickness:float=1.0)->Noneadd_quad_filled(a:_bimpy.Vec2,b:_bimpy.Vec2,c:_bimpy.Vec2,d:_bimpy.Vec2,col:int)->Noneadd_rect(a:_bimpy.Vec2,b:_bimpy.Vec2,col:int,rounding:float=0.0,rounding_corners_flags:int=Corner.All,thickness:float=1.0)->Noneadd_rect_filled(a:_bimpy.Vec2,b:_bimpy.Vec2,col:int,rounding:float=0.0,rounding_corners_flags:int=Corner.All)->Noneadd_rect_filled_multicolor(a:_bimpy.Vec2,b:_bimpy.Vec2,col_upr_left:int,col_upr_right:int,col_bot_right:int,col_bot_lefs:int)->Noneadd_triangle(a:_bimpy.Vec2,b:_bimpy.Vec2,c:_bimpy.Vec2,col:int,thickness:float=1.0)->Noneadd_triangle_filled(a:_bimpy.Vec2,b:_bimpy.Vec2,c:_bimpy.Vec2,col:int)->None

下面的简单用法示例:

hello-world
importbimpyimportnumpyasnpctx=bimpy.Context()ctx.init(1200,1200,"Draw Commands Test")withctx:bimpy.themes.set_light_theme()DATA_POINTS=bimpy.Int(30)CLASTERS=bimpy.Int(4)std=bimpy.Float(0.5)colors=[0x4b19e6,0x4bb43c,0x19e1ff,0xc88200,0x3182f5,0xb41e91,0xf0f046,0xf032e6,0xd2f53c,0xfabebe,0x008080,0xe6beff,0xaa6e28,0xfffac8,0x800000,0xaaffc3,0x808000,0xffd8b1,0x000080,0x808080,0xFFFFFF,0x000000]datapoints=[]defgenerate_fake_data():datapoints.clear()foriinrange(CLASTERS.value):x=np.random.normal(size=(DATA_POINTS.value,2))alpha=np.random.rand()scale=std.value*np.random.rand(2)*np.eye(2,2)position=np.random.rand(2)*5rotation=np.array([[np.cos(alpha),np.sin(alpha)],[-np.sin(alpha),np.cos(alpha)]])x=np.matmul(x,scale)x=np.matmul(x,rotation)x+=positiondatapoints.append((x,rotation,position,scale))axis=x=np.array([[-1,0],[1,0],[0,-1],[0,1]])whilenotctx.should_close():ctx.new_frame()bimpy.set_next_window_pos(bimpy.Vec2(20,20),bimpy.Condition.Once)bimpy.set_next_window_size(bimpy.Vec2(800,600),bimpy.Condition.Once)bimpy.begin("Drawings")window_pos=bimpy.get_window_pos()center=bimpy.Vec2(100,100)+window_posm=100.0foriinrange(len(datapoints)):(x,R,P,S)=datapoints[i]forjinrange(x.shape[0]):point=bimpy.Vec2(x[j,0],x[j,1])bimpy.add_circle_filled(point*m+center,5,0xAF000000+colors[i],100)axis_=np.matmul(axis,S*2.0)axis_=np.matmul(axis_,R)+Pbimpy.add_line(center+bimpy.Vec2(axis_[0,0],axis_[0,1])*m,center+bimpy.Vec2(axis_[1,0],axis_[1,1])*m,0xFFFF0000,1)bimpy.add_line(center+bimpy.Vec2(axis_[2,0],axis_[2,1])*m,center+bimpy.Vec2(axis_[3,0],axis_[3,1])*m,0xFFFF0000,1)bimpy.end()bimpy.set_next_window_pos(bimpy.Vec2(20,640),bimpy.Condition.Once)bimpy.set_next_window_size(bimpy.Vec2(800,140),bimpy.Condition.Once)bimpy.begin("Controls")bimpy.input_int("Data points count",DATA_POINTS)bimpy.input_int("Clasters count",CLASTERS)bimpy.slider_float("std",std,0.0,3.0)ifbimpy.button("Generate data"):generate_fake_data()bimpy.end()ctx.render()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java对ServiceListener和ServiceTracker调用提供了哪些排序保证?   java找不到方法格式的符号(DateTimeFormatter)?   mysql有没有一种方法可以将TCPDump输出到一个文件中,并用Java对其进行过滤,每5秒钟用新数据覆盖一次该文件?   java如何最好地配置用户上传支持文件的上传位置   java我在Android上使用OData4j,我无法获取实体   JPA实体关系简单示例中的java获取错误   JAVANoClassDefFoundError:安卓。应用程序。用法安卓中的UsageStatsManager   Eclipse中javaoo代码分析   java MethodVisitor抛出类格式错误   java为什么在从ViewModel调用时,改型排队不起作用?   调试小程序Java控制台:删除跟踪消息大小限制   java复杂安卓活动动画   java如何在使用JDOM2解析XML时忽略注释内容   java通过循环创建文本字段   即使在bufferedwriter关闭后也未发现java文件异常   单链表恢复中的java错误