简体   繁体   中英

Accel not working in gedit 3 plugin

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.

  1. What is wrong with this code?
  2. 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()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM