请求提供TraitsUI创建带经典菜单栏与Mayavi场景的应用示例
没问题,我给你整理了一个完全符合需求的TraitsUI应用示例,包含你要的所有功能,代码可以直接运行:
from traits.api import ( HasTraits, Bool, Float, File, on_trait_change ) from traitsui.api import ( View, VGroup, HSplit, MenuBar, Menu, Action, Handler, Item, spring ) from mayavi.core.ui.api import MayaviScene, MlabSceneModel, SceneEditor import mayavi.mlab as mlab # 菜单事件处理类 class AppHandler(Handler): def open_file(self, info): """处理File -> Open动作""" print("Opening file:", info.object.open_file_dialog) # 这里可以添加实际的文件加载逻辑,比如读取数据后更新Mayavi场景 if info.object.open_file_dialog: mlab.clf(figure=info.object.scene.mayavi_scene) mlab.test_plot3d(figure=info.object.scene.mayavi_scene) def save_file(self, info): """处理File -> Save动作""" print("Saving to:", info.object.save_file_dialog) # 这里可以添加实际的场景保存逻辑,比如导出图片或数据 if info.object.save_file_dialog: mlab.savefig(info.object.save_file_dialog, figure=info.object.scene.mayavi_scene) def exit_app(self, info): """处理File -> Exit动作""" info.ui.dispose() # 主应用类 class MayaviTraitsApp(HasTraits): # 右侧控件属性 show_axis = Bool(True, label="Show Axis") sphere_radius = Float(1.0, label="Sphere Radius") # 菜单关联的文件对话框 open_file_dialog = File(filter=["*.txt", "*.csv", "*.vtk"], label="Open File") save_file_dialog = File(filter=["*.png", "*.pdf", "*.vtk"], label="Save File") # Mayavi场景模型 scene = MlabSceneModel() # 定义菜单动作 open_action = Action(name="Open", action="open_file") save_action = Action(name="Save", action="save_file") exit_action = Action(name="Exit", action="exit_app") # 初始化场景 def __init__(self, **traits): super().__init__(**traits) self._update_scene() @on_trait_change('show_axis, sphere_radius') def _update_scene(self): """控件变化时自动更新Mayavi场景""" mlab.clf(figure=self.scene.mayavi_scene) # 创建球体示例可视化 mlab.points3d(0, 0, 0, scale_factor=self.sphere_radius*2, figure=self.scene.mayavi_scene) # 控制坐标轴显示状态 self.scene.mayavi_scene.scene.axes.visible = self.show_axis # UI布局定义 traits_view = View( HSplit( # 左侧:Mayavi主场景,占大部分空间 Item('scene', editor=SceneEditor(scene_class=MayaviScene), show_label=False, resizable=True, width=600, height=400), # 右侧:控件组,靠右对齐 VGroup( Item('show_axis'), Item('sphere_radius'), spring, # 用spring把控件固定在顶部,避免拉伸 alignment='right', label="Controls", show_border=True ), resizable=True ), # 顶部菜单栏 menubar=MenuBar( Menu(open_action, save_action, exit_action, name='&File') ), title="TraitsUI + Mayavi Integrated App", resizable=True, width=800, height=500 ) # 启动应用 if __name__ == "__main__": app = MayaviTraitsApp() app.configure_traits()
关键模块说明:
- 菜单栏实现:通过
MenuBar和Action定义经典的File菜单,AppHandler类负责处理每个菜单的点击事件,你可以直接在对应方法里添加业务逻辑(比如加载自定义数据、导出场景)。 - Mayavi场景集成:用
MlabSceneModel和SceneEditor将Mayavi可视化无缝嵌入TraitsUI窗口,控件变化时会自动触发场景更新。 - 右侧控件组:用
VGroup包裹Bool和Float输入框,通过alignment='right'实现靠右对齐,spring用来保持控件在组的顶部位置,避免被窗口拉伸变形。 - 布局调整:
HSplit允许你拖动分隔线调整左右区域的宽度,如果需要固定右侧控件宽度,可以换成HBox配合spring实现,比如:HBox( Item('scene', ...), spring, VGroup(...), resizable=True )
这个示例已经覆盖了你要求的所有核心功能,你可以根据自己的需求修改可视化内容、菜单逻辑或者控件样式。
内容的提问来源于stack exchange,提问作者srk
相关产品推荐
相关产品推荐

