I was trying to write a small plugin for Gedit 3 which uses GObject introspection. The relevant part of code shown below just aims at getting an environment up where I could then fit in the function in the callback for the button. However, the accelerator for the button is not working.
- What is wrong with this code?
I am using the tutorial here and the python documentation for GTK 3 here. Is there any other links that you know of?
from gi.repository import Gtk, Gedit, GObject
ui_string = """<ui>
<toolbar name="ToolBar">
<separator />
<toolitem name="Test" action="Test" />
</toolbar>
</ui>
"""
class test:
def __init__(self, plugin, window):
self.window = window
self.plugin = plugin
self.ui_id = None
manager = self.window.get_ui_manager()
action_group = Gtk.ActionGroup("TestPluginactions")
action_test_button = Gtk.Action(name="Test",
label="Test",
tooltip="Test",
stock_id=Gtk.STOCK_EXECUTE)
action_test_button.connect("activate", self.testcallback)
action_group.add_action_with_accel(action_test_button, "<Ctrl>l")
manager.insert_action_group(action_group, -1)
self.ui_id = manager.add_ui_from_string(ui_string)
manager.ensure_update()
def deactivate(self):
manager = self.window.get_ui_manager()
manager.remove_ui(self.ui_id)
self.ui_id = None
self.window = None
self.plugin = None
def testcallback(self,unused):
dialog1 = Gtk.MessageDialog(self.window,Gtk.DialogFlags.DESTROY_WITH_PARENT,
Gtk.MessageType.ERROR,Gtk.ButtonsType.OK,"TEST")
dialog1.run()
dialog1.destroy()
class WindowActivatable(GObject.Object, Gedit.WindowActivatable):
window = GObject.property(type=Gedit.Window)
def __init__(self):
GObject.Object.__init__(self)
self.instances = {}
def do_activate(self):
self.instances[self.window] = test(self, self.window)
def do_deactivate(self):
if self.window in self.instances:
self.instances[self.window].deactivate()
Got to know that GTK 3 has either some bug which does not allow shortcuts to be assigned to the toolitems in the way shown above. Menu items however work fine. So the below code is better.
from gi.repository import Gtk, Gedit, GObject
ui_string = """<ui>
<toolbar name="ToolBar">
<separator />
<toolitem name="Test" action="Test" />
</toolbar>
<menubar name="MenuBar">
<menu name="ToolsMenu" action="Tools">
<placeholder name="ToolsOps_2">
<menuitem name="test1" action="test1"/>
</placeholder>
</menu>
</menubar>
</ui>
"""
class test:
def __init__(self, plugin, window):
self.window = window
self.plugin = plugin
self.ui_id = None
manager = self.window.get_ui_manager()
action_group = Gtk.ActionGroup("TestPluginactions")
action_test_button = Gtk.Action(name="Test",
label="Test",
tooltip="Test",
stock_id=Gtk.STOCK_EXECUTE)
action_test = Gtk.Action(name="test1",
label="Test",
tooltip="Test",
stock_id=Gtk.STOCK_EXECUTE)
action_test_button.connect("activate", self.testcallback)
action_test.connect("activate", self.testcallback)
action_group.add_action(action_test_button)
action_group.add_action_with_accel(action_test, "<Ctrl>l")
manager.insert_action_group(action_group, -1)
self.ui_id = manager.add_ui_from_string(ui_string)
manager.ensure_update()
def deactivate(self):
manager = self.window.get_ui_manager()
manager.remove_ui(self.ui_id)
self.ui_id = None
self.window = None
self.plugin = None
def testcallback(self,unused):
dialog1 = Gtk.MessageDialog(self.window,Gtk.DialogFlags.DESTROY_WITH_PARENT,
Gtk.MessageType.ERROR,Gtk.ButtonsType.OK,"TEST")
dialog1.run()
dialog1.destroy()
class WindowActivatable(GObject.Object, Gedit.WindowActivatable):
window = GObject.property(type=Gedit.Window)
def __init__(self):
GObject.Object.__init__(self)
self.instances = {}
def do_activate(self):
self.instances[self.window] = test(self, self.window)
def do_deactivate(self):
if self.window in self.instances:
self.instances[self.window].deactivate()