A menubar is added now.
#!/usr/bin/env python3
# Copyright (C) 2013 LiuLang <[email protected]>
# Use of this source code is governed by GPLv3 license that can be found
# in http://www.gnu.org/licenses/gpl-3.0.html
from gi.repository import Gio
from gi.repository import Gtk
import sys
menus_str ='''
<?xml version="1.0"?>
<interface>
<menu id="appmenu">
<section>
<item>
<attribute name="label" translatable="yes">Preferences</attribute>
<attribute name="action">app.preferences</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">About</attribute>
<attribute name="action">app.about</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Quit</attribute>
<attribute name="action">app.quit</attribute>
<attribute name="accel"><Primary>q</attribute>
</item>
</section>
</menu>
<menu id="menubar">
<submenu>
<attribute name="label">_Help</attribute>
<section>
<item>
<attribute name="label">_About</attribute>
<attribute name="action">app.about</attribute>
</item>
</section>
</submenu>
</menu>
</interface>
'''
class App:
def __init__(self):
self.app = Gtk.Application.new('org.liulang.test', 0)
self.app.connect('startup', self.on_app_startup)
self.app.connect('activate', self.on_app_activate)
self.app.connect('shutdown', self.on_app_shutdown)
def run(self, argv):
self.app.run(argv)
def on_app_startup(self, app):
self.window = Gtk.ApplicationWindow.new(app)
self.window.set_default_size(640, 480)
self.window.set_title('Gio Actions Demo')
self.window.set_border_width(5)
# no need to connect delete-event/destroy signal
app.add_window(self.window)
label = Gtk.Label('Hello, Gtk3')
self.window.add(label)
label.props.halign = Gtk.Align.CENTER
label.props.valign = Gtk.Align.CENTER
builder = Gtk.Builder()
# It is better to load ui from a seperate file
builder.add_from_string(menus_str)
builder.connect_signals(self)
appmenu = builder.get_object('appmenu')
app.set_app_menu(appmenu)
menubar = builder.get_object('menubar')
app.set_menubar(menubar)
self.add_simple_action('preferences',
self.on_action_preferences_activated)
self.add_simple_action('about', self.on_action_about_activated)
self.add_simple_action('quit', self.on_action_quit_activated)
def on_app_activate(self, app):
self.window.show_all()
def on_app_shutdown(self, app):
# do some cleaning job here, like dumping configuration.
pass
def on_action_preferences_activated(self, action, user_data):
print('will popup preferences dialog')
def on_action_about_activated(self, action, user_data):
print('will show about dialog')
def on_action_quit_activated(self, action, user_data):
# This will close the default gtk mainloop
self.app.quit()
def add_simple_action(self, name, callback):
action = Gio.SimpleAction.new(name, None)
action.connect('activate', callback)
self.app.add_action(action)
if __name__ == '__main__':
app = App()
app.run(sys.argv)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…