如何将菜单添加到工具栏? gtk3

时间:2013-04-08 22:01:44

标签: python menu toolbar gtk3

好的我找到了办法。如果您有其他方式,您仍然可以给出答案。你可能有一个更简单的方法。在此期间,我会尝试为我的答案格式化回复。我发现的方法有点乱,所以我不得不花时间。现在我将不接受我的回答,看看其他人是否有更好的方法。

我正在使用带有gtk3的python。

对于gtk3,有一个menutool按钮,但文档中对它的用法描述对我来说还不够明确。

除此之外,我还想要一个没有用于此工具按钮的拖放箭头的普通按钮。

如果有办法用gtk uimanager做这个,我宁愿这样做。

1 个答案:

答案 0 :(得分:0)

这是我的答案。

它有点长远,但它有效。

其中一个主要问题是我认为我可以在网格中使用最近的按钮,但gtk似乎只有最近的工具栏和菜单操作。因此,如果我还想要另一个带弹出窗口的工具栏按钮,那将会变得复杂,因为工具栏按钮不容易自定义而没有下拉箭头。

长话短说。我使用常规弹出按钮走了很长一段路,并制作了一个网格来包含它和工具栏。

#the popup you see here will get used for the menu button
TOOLBAR_UI = """
<ui>
    <toolbar name="ToolBar">
        <toolitem action="FileOpen" />
        <toolitem action="FileSave"  />
        <toolitem action="FileSaveAs" />
        <toolitem action="Undo" />
        <toolitem action="Redo" />
    </toolbar>
    <popup name="Menu">
        <menuitem action="Bla" />
    </popup>
</ui>
"""
class GroupView(Gtk.Grid):

    def __init__(self):
        Gtk.Grid.__init__(self, orientation=Gtk.Orientation.HORIZONTAL)
        #the toolbar grid is placed in another grid to be
        #placed in a gtk.window
        group_toolbar = Toolbar()
        self.add(group_toolbar)


class Toolbar(Gtk.Grid):
    def __init__(self):
        Gtk.Grid.__init__(self, orientation=Gtk.Orientation.HORIZONTAL)
        toolbar = Tools()
        #toolbar is actually a grid with an actual toolbar
        #and the menu button is in the grid
        self.add(toolbar.display())
        self.add(toolbar.extra_menu)

class Tools(Gtk.UIManager):
    text_view = None
    def __init__(self):
        Gtk.UIManager.__init__(self)
        self.add_ui_from_string(TOOLBAR_UI)
        action_group = Gtk.ActionGroup("actions")
        self.add_toolbar_actions(action_group)

    def set_text_view(self, textview):
        self.textview = textview

    def add_toolbar_actions(self, action_group):
        self.insert_action_group(action_group)
        #
        #..normal toolbar construction here
        #

        #its a menu button so only the menu actions
        #need to be taken care of
        action_bla = Gtk.Action("Bla", 'bla', None, None)
        action_bla.connect("activate", self.action_bla_clicked)
        action_group.add_action(action_bla)
        #..the menu button is created here
        self.extra_menu = ExtraMenu()
        self.extra_menu.set_popup(self.get_widget("/Menu"))

        #start action callbacks
        #...placeholder for callbacks
        #end action callbacks
    #get ready to export the toolbar
    def display(self):
        toolbar = self.get_widget("/ToolBar")
        toolbar.set_hexpand(True)
        return toolbar

class ExtraMenu(Gtk.MenuButton):
    def __init__(self):
        Gtk.MenuButton.__init__(self)
        arrow = self.get_children()[0]
        #the arrow is destroyed and a custom image is placed in the button
        arrow.destroy()
        self.add(Gtk.Image.new_from_stock(Gtk.STOCK_EXECUTE, Gtk.IconSize.BUTTON))

如果您尝试上面的代码,请不要忘记添加一个窗口,以及一些动作回调。 如果你不能告诉我喜欢子类化gtk很多。 :)