open3d中的对话框用gui.Dialog
来实现,但这个对话框其实只有个框,并没有对话,需要人为地进行布局规划。
如果单纯地希望演示一下对话框,那么只需
import open3d as o3d
import open3d.visualization.gui as gui
import open3d.visualization.rendering as rendering
app = gui.Application.instance
app.initialize()
win = app.create_window("Dialog Test", 600, 200)
dlg = gui.Dialog("Open3d dialog test")
dlg.add_child(gui.Button("OK"))
win.show_dialog(dlg)
app.run()
如下图所示那个OK的按钮就在对话框中,但是这个按钮并没有封装任何方法,所以对话框也只能孤零零地在窗口中间,动弹不得,甚至关都关不掉。
为了动态展示对话框的弹出和关闭功能,需要现在窗口中封装一个可以打开对话框的按钮
app.initialize()
win = app.create_window("Dialog Test", 600, 300)
btn = gui.Button("open Dialog")
win.add_child(btn)
btn.set_on_clicked(btn_open_dialog)
def btn_open_dialog():
dlg = gui.Dialog("Dialog Test")
close = gui.Button("Close")
close.set_on_clicked(btn_close_dialog)
dlg.add_child(close)
win.show_dialog(dlg)
def btn_close_dialog():
win.close_dialog()
pass
app.run()
效果如下
由于无论是窗口还是对话框,都未作布局上的调整,所以open Dialog
按钮覆盖了整个窗口,而Close
按钮也是完全覆盖了对话框。但二者的功能被很好地体现出来,点击窗口中的按钮弹出对话框,点击对话框中的按钮,对话框被关闭。
在日常使用中,对话框出现最多的场景就是打开文件,这个对话框至少要包括一个用以显示文件的列表。而open3d
中也提供了文件对话框,尽管体验一般,但无论是打开还是保存文件,都应付得来。
FileDialog
在初始化时,共有三个输入参数,分别表示对话框的模式、窗口名称以及风格。
其中,对话框模式共有三种
另外,和普通的对话框不同,文件对话框默认载入了两个按钮,分别通过set_on_done
和set_on_cancel
来挂载回调函数。
以打开文件夹为例,由于其功能就是打开文件,故可通过add_filter
来选择文件类别,示例如下
import open3d as o3d
import open3d.visualization.gui as gui
import open3d.visualization.rendering as rendering
app = gui.Application.instance
app.initialize()
win = app.create_window("Dialog Test", 600, 300)
def btn_cancel():
win.close_dialog()
def btn_done(fName):
print(fName)
win.close_dialog()
def btn_open_dialog():
dlg = gui.FileDialog(gui.FileDialog.OPEN,
"Dialog Test", win.theme)
dlg.add_filter(".pcd", "Point Cloud Data files (.pcd)")
dlg.set_on_cancel(btn_cancel)
dlg.set_on_done(btn_done)
win.show_dialog(dlg)
btn = gui.Button("open Dialog")
win.add_child(btn)
btn.set_on_clicked(btn_open_dialog)
app.run()
效果如下