You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求提供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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:51:09