2015-08-17 2 views
1

Я пытаюсь создать серию меню в приложении программы визуализации traitsui. Мой графический интерфейс состоит из последовательности панелей, которые используют разные объекты модели, которые отображаются в основном графическом интерфейсе с помощью InstanceEditors. Это имеет множество преимуществ, в том числе, что панели могут быть просто собраны и перестроены в любое время (что важно для визуализации майяви, поскольку майави является багги, часто лучше просто выбросить сцену и начать с нее после того, как пользователь внесет много изменений).MenuBar не появляется внутри InstanceEditor

У меня возникла проблема, что меню не отображаются ни в одной из подпанелей в моем графическом интерфейсе.

Вот минимальный рабочий пример.

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() результат в том же графическом интерфейсе, как с функциональным меню (с одним пунктом под названием «Do материал», который печатает 400 при нажатии) и строки, которые можно редактировать ,

Фактическое поведение, которое я вижу, состоит в том, что графический интерфейс панели имеет как строку, так и меню, в то время как графический интерфейс приложения имеет строку, но меню не отображается.

Есть ли способ сделать меню отображаемым как графический графический интерфейс внутри InstanceEditor?

ответ

1

AFAIK, TraitsUI не поддерживает MenuBar в подзадаче. У вас может быть лучший успех на панели инструментов, но как MenuBar, так и ToolBar необходимо будет определить в виде Application. Я получил следующий минимальный интерфейс для работы с несколькими ухищрений:

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) 

Вот как это выглядело для меня на Mac OS с Qt4 бэкэндом:

enter image description here

enter image description here

+0

Да Добавление меню на внешнюю панель не является проблемой технически. Но это было бы гораздо более удобным дизайном и, возможно, более простым для пользователя, я думаю, если бы в подпанелях было свое меню, связанное с выполнением различных функций внутри подпанелей, вместо того, чтобы иметь код для обработки действий в одной гигантской строке в самом внешнем графическом интерфейсе. – aestrivex

+0

Мини-меню, относящиеся к подзаголовку, нарушат стандартное соглашение с графическим интерфейсом (меню и панели инструментов относятся к приложению). Однако вы могли бы добавить кнопки в вложенное представление. –

+0

Вот как выглядел графический интерфейс в прошлых циклах, подпанели были загроможденными кнопками. Но поскольку я добавил все больше и больше функций, которые только что получили, слишком много кнопок. – aestrivex

Смежные вопросы