九种控件
根据控件的使用难度和功能的复杂度,这里挑选出九种最简单,同时使用最为频繁的九种控件
入门控件 | 备注 | 输入参数 |
---|---|---|
Label | 文本标签 | |
TextEdit | 文本输入框 | |
Button | 按钮 | |
Checkbox | 单选框 | |
Combobox | 下拉选框 | |
Slider | 数字滚动条 | Slider.Type |
VectorEdit | 向量编辑框 | |
NumberEdit | 数字编辑框 | |
ToggleSwitch | 开关 |
其中,大部分控件的输入参数为控件上显示出来的文本,这些控件都可以通过外挂函数的方式来添加交互动作。
Combobox
为下拉选框,下拉选框的内容通过add_item
来添加。
Slider
为滚动条,创建之后,其初始值默认为0,取值范围是负无穷到正无穷,通过set_limits
来添加最大值和最小值。
代码展示
为了集中展示这些控件的功能,将其写入一个字典中,并为每个控件分配一个控件,向命令行输出一些反馈。
import open3d as o3d
import open3d.visualization.gui as gui
import open3d.visualization.rendering as rendering
app = gui.Application.instance
app.initialize()
# 准备演示的九种控件
CTRLS = {
"label" : gui.Label("label"),
"text" : gui.TextEdit(),
"button" : gui.Button("button"),
"check" : gui.Checkbox("checkbox"),
"combo" : gui.Combobox(),
"slider" : gui.Slider(gui.Slider.Type(0)),
"vector" : gui.VectorEdit(),
"number" : gui.NumberEdit(gui.NumberEdit.Type(0)),
"toggle" : gui.ToggleSwitch("ToggleSwitch")
}
# 为combobox添加内容
for i in range(5):
CTRLS["combo"].add_item(str(i))
# 为 slider 添加取值范围
CTRLS["slider"].set_limits(0,20)
win = app.create_window("Open3d Test", 500, 100)
vert = gui.Vert(0, gui.Margins(2,2,2,2))
win.add_child(vert) # 将布局加载到窗口
for key in CTRLS:
vert.add_child(CTRLS[key])
app.run()
效果如下
这九种控件,除了Label
之外,均可注册回调函数,在发生动作时执行
注册函数
接下来为这些控件分别注册一些函数,其基础函数如下
控件 | 函数 | 执行条件 | 回调函数参数 |
---|---|---|---|
TextEdit | set_on_value_changed | 敲击回车 | 控件文本 |
Button | set_on_clicked | 点击按钮 | 无 |
Checkbox | 单选框 | 点击 | 单选框状态 |
Combobox | 下拉选框 | 值发生变动 | 选中的item序号和值 |
Slider | 数字滚动条 | 位置发生变动 | 当前值 |
VectorEdit | 向量编辑框 | 敲击回车 | 控件向量 |
NumberEdit | 数字编辑框 | 值发生变化 | 控件的值 |
ToggleSwitch | 开关 | 点击 | 开关状态 |
其演示函数如下,可写在app.run()
之前。
# TextEdit的测试函数,其输入为改动后的内容
def text_test(txt):
print(CTRLS["text"].text_value)
CTRLS["text"].set_on_value_changed(print)
# VectorEdit的测试函数,输入为改动后的向量
def vector_test(vec):
print(CTRLS["vector"].vector_value)
CTRLS["vector"].set_on_value_changed(vector_test)
# Slider的测试函数,输入为改动后的值
def slider_test(val):
print(CTRLS["slider"].int_value)
pass
CTRLS["slider"].set_on_value_changed(slider_test)
# val 和 ind 分别为combo选中的位置和选中的值
def combo_test(val, ind):
print(CTRLS["combo"].selected_index)
print(CTRLS["combo"].selected_text)
CTRLS["combo"].set_on_selection_changed(combo_test)
# Checkbox的测试函数,chk为选中后的值
def check_test(chk):
print(CTRLS["check"].checked)
CTRLS["check"].set_on_checked(check_test)
def toggle_test(isOn):
# 当打开toggle时,is_on为True,否则为False
print(CTRLS["toggle"].is_on)
CTRLS["toggle"].set_on_clicked(toggle_test)