2013-04-13 3 views
1

У меня есть приложение, в котором некоторые действия меню не должны быть чувствительными, прежде чем произойдут какие-то другие вещи (как в минимальном коде ниже, «Сохранить» не имеет смысла до «Нового» 'был нажат).Настройка чувствительности к конкретным Gtk3 MenuActions (python)

Простой настройкой всего меню, такого как меню «Файл» в примере, нечувствительным. Также легко настроить кнопки панели инструментов нечувствительными. Оба они отображаются как дети для MenuBar и ToolBar соответственно.

Однако я полностью потерялся, когда пытаюсь установить отдельные действия в меню. Я просто не нахожу пути к ним. Ни один из них не поднимается (после того, как они были нажаты), как в методе _do_save в этом примере, или не идет из меню вниз.

Вопрос:

Как установить а «Сохранить» нечувствительны от начала и получить его, чтобы стать чувствительным, когда была нажата «Новый»?

Требование:

Я все еще хочу использовать UIManager, как показано ниже, чтобы настроить меню.

Решение не должно требовать от пользователя нажатия кнопки «Сохранить» для переключения его чувствительности, оно должно быть нечувствительным с самого начала.

Минимальный код:

Комментарий в __init__ шоу, где я надеюсь, чтобы получить доступ к меню-действие ...

#!/usr/bin/env python 
from gi.repository import Gtk 


class W(Gtk.Window): 

    UI = """ 
    <menubar name="MainMenu"> 
     <menu action="MenuFile"> 
      <menuitem action="MenuNew" /> 
      <menuitem action="MenuSave" /> 
      <separator /> 
      <menuitem action="MenuQuit" /> 
     </menu> 
    </menubar> 
    """ 

    def __init__(self): 

     super(W, self).__init__() 
     self.set_default_size(300, 300) 
     self.connect("destroy", Gtk.main_quit) 

     box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 
     self.add(box) 

     action_group = Gtk.ActionGroup("ui_actions") 
     action_group.add_actions(
      [ 
       ('MenuFile', None, '_File'), 
       ('MenuNew', Gtk.STOCK_NEW, '_New', None, 'Should enable save', 
       self._do_new), 
       ('MenuSave', Gtk.STOCK_SAVE, '_Save', None, 
       'Only sensitive after new', self._do_save), 
       ('MenuQuit', Gtk.STOCK_QUIT, '_Quit', None, 'Exits', 
       Gtk.main_quit) 
      ] 
     ) 

     uim = Gtk.UIManager() 
     uim.add_ui_from_string(self.UI) 
     self.add_accel_group(uim.get_accel_group()) 
     uim.insert_action_group(action_group) 

     self._menu = uim.get_widget("/MainMenu") 
     box.pack_start(self._menu, False, False, 0) 

     #HERE'S WHERE I DON'T KNOW WHAT TO DO 
     #How to append the widget corresponing ot 'MenuSave' into 
     #self._sensitie_widgets 
     self._sensitive_widgets = [] 
     self._set_sensitive_state(False) 

     self.show_all() 

    def _set_sensitive_state(self, val): 
     """Does nothing now, because the GtkAction for 'MenuSave' has 
     not been appended to self._set_sensitive_state""" 

     for w in self._sensitive_widgets: 
      w.set_sensitive(val) 

    def _do_new(self, *args): 
     """Callback should just invoke self._set_sensitive_state as below""" 

     self._set_sensitive_state(True) 

    def _do_save(self, widget): 
     """This should only be possible after New has been pressed. 
     Currently a failed attempt at tracing the way to access it.""" 
     def _do_trace(w): 

      if hasattr(w, 'get_parent'): 
       _do_trace(w.get_parent()) 

      else: 
       print dir(w) 
      print w 

     _do_trace(widget) 

if __name__ == "__main__": 

    w = W() 
    Gtk.main() 

Любая помощь будет высоко ценится, потому что я теряю мой (кажется, что это должно быть довольно прямолинейно) ...

ответ

0
w = [uim.get_widget('/MainMenu/MenuFile/MenuSave')] 
+0

Wow, это было определенно просто! – deinonychusaur

+0

Другое решение: создать и сохранить объекты Action: 'action_save = Gtk.Action ('MenuSave', ...)' 'w = [action_save]' – kalgasnik

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