# By Jarek Zgoda and Johan Dahlin
import pygtk
pygtk.require('2.0')
import gtk
ui_string = """
"""
class Application(gtk.Window):
def __init__(self, title=''):
gtk.Window.__init__(self)
self.connect('delete-event', self._on_delete_event)
self.set_position(gtk.WIN_POS_CENTER)
self.set_size_request(400, 200)
self.set_title(title)
main_vbox = gtk.VBox()
self.add(main_vbox)
main_vbox.show()
uimgr = self._create_ui()
uimgr.connect('connect-proxy',
self._on_uimanager__connect_proxy)
uimgr.connect('disconnect-proxy',
self._on_uimanager__disconnect_proxy)
menubar = uimgr.get_widget('/Menubar')
main_vbox.pack_start(menubar, expand=False)
menubar.show()
toolbar = uimgr.get_widget('/Toolbar')
main_vbox.pack_start(toolbar, expand=False)
toolbar.realize()
toolbar.show()
status = gtk.Statusbar()
main_vbox.pack_end(status, expand=False)
status.show()
self.statusbar = status
self._menu_cix = -1
def _create_ui(self):
ag = gtk.ActionGroup('AppActions')
actions = [
('FileMenu', None, '_File'),
('New', gtk.STOCK_NEW, '_New', 'N',
'Create a new file', self._on_action_new),
('Open', gtk.STOCK_OPEN, '_Open', 'O',
'Open a file', self._on_action_open),
('Save', gtk.STOCK_SAVE, '_Save', 'S',
'Save a file', self._on_action_save),
('Close', gtk.STOCK_CLOSE, '_Close', 'W',
'Close the current window', self._on_action_close),
('Quit', gtk.STOCK_QUIT, '_Quit', 'Q',
'Quit application', self._on_action_quit),
('HelpMenu', None, '_Help'),
('About', None, '_About', None, 'About application',
self._on_action_about),
]
ag.add_actions(actions)
ui = gtk.UIManager()
ui.insert_action_group(ag, 0)
ui.add_ui_from_string(ui_string)
self.add_accel_group(ui.get_accel_group())
return ui
def _on_uimanager__connect_proxy(self, uimgr, action, widget):
tooltip = action.get_property('tooltip')
if not tooltip:
return
if isinstance(widget, gtk.MenuItem):
cid = widget.connect('select', self._on_menu_item__select,
tooltip)
cid2 = widget.connect('deselect', self._on_menu_item__deselect)
widget.set_data('pygtk-app::proxy-signal-ids', (cid, cid2))
elif isinstance(widget, gtk.ToolButton):
cid = widget.child.connect('enter', self._on_tool_button__enter,
tooltip)
cid2 = widget.child.connect('leave', self._on_tool_button__leave)
widget.set_data('pygtk-app::proxy-signal-ids', (cid, cid2))
def _on_uimanager__disconnect_proxy(self, uimgr, action, widget):
cids = widget.get_data('pygtk-app::proxy-signal-ids')
if not cids:
return
if isinstance(widget, gtk.ToolButton):
widget = widget.child
for name, cid in cids:
widget.disconnect(cid)
def _on_menu_item__select(self, menuitem, tooltip):
self.statusbar.push(self._menu_cix, tooltip)
def _on_menu_item__deselect(self, menuitem):
self.statusbar.pop(self._menu_cix)
def _on_tool_button__enter(self, toolbutton, tooltip):
self.statusbar.push(self._menu_cix, tooltip)
def _on_tool_button__leave(self, toolbutton):
self.statusbar.pop(self._menu_cix)
def _on_action_new(self, action):
self.new()
def _on_action_open(self, action):
self.open()
def _on_action_save(self, action):
self.save()
def _on_action_close(self, action):
self.close()
def _on_action_quit(self, action):
self.quit()
def _on_action_about(self, action):
self.about()
def _on_delete_event(self, window, event):
self.quit()
# Override in subclass
def new(self):
raise NotImplementedError("Open")
def open(self):
raise NotImplementedError("Open")
def save(self):
raise NotImplementedError("Save")
def close(self):
raise NotImplementedError("Close")
def about(self):
raise NotImplementedError("About")
def run(self):
self.show()
gtk.main()
def quit(self):
gtk.main_quit()
if __name__ == '__main__':
a = Application(title="TestApp")
a.run()