PyGObject:如何以编程方式创建汉堡菜单

PyGObject: How to create hamburger menu programmatically

我想以编程方式创建一个“主菜单”,我相信它也被称为“汉堡菜单”。我在 Web 开发方面完成了其中的几个,但我从未使用 Python 和 GTK 完成过这些。这个话题似乎是有争议的,并且有很多不同的解决方案。我想使用未弃用的方式创建这样的菜单。

文档中提到旧式菜单已弃用(整个部分存档在“已弃用”下):https://python-gtk-3-tutorial.readthedocs.io/en/latest/menus.html

在这个例子中,整个 HeaderBar 都是以编程方式制作的,并在其中添加了一个(弹出)菜单: GtkMenuButton popups

虽然这似乎可以解决问题,但它不是“汉堡包”菜单,文档似乎建议“您的菜单应使用 Gio.Menu 在 XML 中定义”: https://python-gtk-3-tutorial.readthedocs.io/en/latest/application.html#menus

所以我在这里迷路了。有人可以给我一个如何实现这一目标的例子吗?最好以编程方式完成,但如果 XML 是唯一的方法,那就这样吧。

提前致谢!

我没有足够的声誉来评论所以我就把它放在这里:你可以使用 GMenu:https://wiki.gnome.org/HowDoI/GMenu

我 post 我的解决方案是在 irc.gnome.org #python 频道的帮助下完成的。它并不完美,菜单操作仍然无法正常工作,但至少我完成了菜单,这就是这个 post.

的重点
#!/usr/bin/env python3

# Python imports
import sys

# GTK imports
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gio
from gi.repository import Gtk

class AppWindow(Gtk.ApplicationWindow):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.set_border_width(10)
        self.set_default_size(640, 480)

        open_selection = Gtk.ModelButton(action_name="open_file", label="Open")
        about_selection = Gtk.ModelButton(action_name="about_application", label="About")

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin=10, spacing=10)
        vbox.add(open_selection)
        vbox.add(about_selection)
        vbox.show_all()

        self.popover = Gtk.Popover()
        self.popover.add(vbox)
        self.popover.set_position(Gtk.PositionType.BOTTOM)

        menu_button = Gtk.MenuButton(popover=self.popover)
        menu_icon = Gtk.Image.new_from_icon_name("open-menu-symbolic", Gtk.IconSize.MENU)
        menu_icon.show()
        menu_button.add(menu_icon)
        menu_button.show()

        headerbar = Gtk.HeaderBar()
        headerbar.props.show_close_button = True
        headerbar.props.title = "Hamburger Menu Demo"
        headerbar.add(menu_button)
        headerbar.show()
        self.set_titlebar(headerbar)

    def open_file(self, widget):
        print("Open file")

class Application(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, application_id="org.example.myapp")
        self.window = None

    def do_startup(self):
        Gtk.Application.do_startup(self)

        action = Gio.SimpleAction.new("open_file", None)
        action.connect("activate", self.open_file)
        action.set_enabled(True)
        self.add_action(action)

        action = Gio.SimpleAction.new("about_application", None)
        action.connect("activate", self.on_about)
        self.add_action(action)

        action = Gio.SimpleAction.new("quit", None)
        action.connect("activate", self.on_quit)
        self.add_action(action)

    def do_activate(self):
        # We only allow a single window and raise any existing ones
        if not self.window:
            # Windows are associated with the application
            # when the last one is closed the application shuts down
            self.window = AppWindow(application=self, title="Main Window")

        self.window.present()

    def open_file(self, action, param):
        print("Open file")

    def on_about(self, action, param):
        print("About application")

    def on_quit(self, action, param):
        self.quit()


if __name__ == "__main__":
    app = Application()
    app.run(sys.argv)