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)
我想以编程方式创建一个“主菜单”,我相信它也被称为“汉堡菜单”。我在 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)