1

我正在尝试在我的 traitsui 可视化程序应用程序中构建一系列菜单。我的 GUI 由一系列面板组成,这些面板都使用不同的模型对象,这些面板都使用 InstanceEditors 显示在主 GUI 中。这有很多好处,包括面板可以随时被垃圾收集和重建(这对于 mayavi 可视化很重要,因为 mayavi 有问题,通常最好在用户进行大量更改后丢弃场景并重新开始)。

我遇到的问题是菜单没有出现在我的 GUI 的任何子面板中。

这是一个最小的工作示例。

from traits.api import HasTraits, Str, Instance
from traitsui.api import Menu, View, MenuBar, Action, Item, InstanceEditor

class Panel(HasTraits):

    field = Str('placeholder_variable')
    stuff_action = Action(name='Do stuff', action='do_stuff')

    view = View(
        Item('field'),
        menubar = MenuBar( Menu( stuff_action, name='Menu')),
    )

    def do_stuff(self):
        print '400'

class Application(HasTraits):
    panel = Instance(Panel, ())

    view = View(
        Item('panel', editor=InstanceEditor(), style='custom'))

Application().configure_traits()

预期的行为是调用Panel().configure_traits()Application().configure_traits()结果在相同的 GUI 中,具有功能菜单(带有一个名为“Do stuff”的项目,单击时打印 400)和可以编辑的字符串。

我看到的实际行为是面板 GUI 既有字符串又有菜单,而应用程序 GUI 有字符串但菜单没有出现。

有没有办法让菜单从内部显示为 GUI 小部件InstanceEditor

4

1 回答 1

2

AFAIK,TraitsUI 将不支持MenuBar子视图中的 a 。使用工具栏可能会取得更好的成功,但是 aMenuBar和 aToolBar都需要在Application's 视图中定义。我得到了以下最小的用户界面,可以进行一些调整:

from traits.api import HasTraits, Str, Instance, Event
from traitsui.api import View, Item, InstanceEditor
from traitsui.menu import Action, Menu, MenuBar, ToolBar

stuff_action = Action(name='Do stuff', action='do_stuff')

class Panel(HasTraits):
    field = Str('placeholder_variable')
    do_stuff_event = Event

    view = View(Item('field'))

class Application(HasTraits):
    panel = Instance(Panel, ())

    def do_stuff(self):
        print '400'

traits_view = View(
    Item(
        'panel',
        editor=InstanceEditor(),
        style='custom',
        show_label=False,
    ),
    menubar=MenuBar(
        Menu(stuff_action, name='Menu'),
    ),
    toolbar=ToolBar(stuff_action),
    resizable=True,
)

app = Application()
app.configure_traits(view=traits_view)

这是我在带有 Qt4 后端的 Mac OS 上的样子:

在此处输入图像描述

在此处输入图像描述

于 2015-08-19T03:47:07.720 回答