我有一个应用程序,其中某些菜单操作在其他一些事情发生之前不应该是敏感的(如下面的最小代码中,'Save'在单击'New'之前没有意义。)
设置整个菜单很简单,例如示例不敏感的文件菜单。设置工具栏按钮也很容易不敏感。这两个广告分别显示为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 :(得分:0)
w = [uim.get_widget('/MainMenu/MenuFile/MenuSave')]