好的我找到了办法。如果您有其他方式,您仍然可以给出答案。你可能有一个更简单的方法。在此期间,我会尝试为我的答案格式化回复。我发现的方法有点乱,所以我不得不花时间。现在我将不接受我的回答,看看其他人是否有更好的方法。
我正在使用带有gtk3的python。
对于gtk3,有一个menutool按钮,但文档中对它的用法描述对我来说还不够明确。
除此之外,我还想要一个没有用于此工具按钮的拖放箭头的普通按钮。
如果有办法用gtk uimanager做这个,我宁愿这样做。
答案 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很多。 :)