1

私は、いくつかのメニューアクションが他のことが起こる前に敏感であると想定されていないアプリを持っています (以下の最小限のコードのように、「新規」がクリックされる前に「保存」は意味がありません)。

例の insensitive の File-menu のように、メニュー全体を設定するのは簡単です。ツールバーのボタンを無効にするのも簡単です。これらは両方とも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()

私はこれに頭を悩ませているので、どんな助けも大歓迎です(それは非常に簡単なはずです)...

4

1 に答える 1

0
w = [uim.get_widget('/MainMenu/MenuFile/MenuSave')]
于 2013-04-13T15:53:02.807 に答える