У меня есть приложение, в котором некоторые действия меню не должны быть чувствительными, прежде чем произойдут какие-то другие вещи (как в минимальном коде ниже, «Сохранить» не имеет смысла до «Нового» 'был нажат).Настройка чувствительности к конкретным 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()
Любая помощь будет высоко ценится, потому что я теряю мой (кажется, что это должно быть довольно прямолинейно) ...
Wow, это было определенно просто! – deinonychusaur
Другое решение: создать и сохранить объекты Action: 'action_save = Gtk.Action ('MenuSave', ...)' 'w = [action_save]' – kalgasnik