MenuBar未出现在InstanceEditor

时间:2015-08-17 15:07:21

标签: python menu enthought traitsui

我正在尝试在我的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有字符串,但菜单没有出现。

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

1 个答案:

答案 0 :(得分:1)

AFAIK,TraitsUI不支持子视图中的MenuBar。使用工具栏可能会取得更大的成功,但MenuBarToolBar都需要在Application的视图中定义。我得到了以下最小的UI来进行一些调整:

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上寻找我的方式:

enter image description here

enter image description here