我正在尝试在我的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小部件?
答案 0 :(得分:1)
AFAIK,TraitsUI不支持子视图中的MenuBar
。使用工具栏可能会取得更大的成功,但MenuBar
和ToolBar
都需要在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上寻找我的方式: