PyGObject でのオーバーライドでハマったので覚書。
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gio, Gdk class NoActionWindow(Gtk.ApplicationWindow): def __init__(self, app): Gtk.ApplicationWindow.__init__(self, application=app) # connect #self.connect("key_press_event", self.on_key_press_event) self.show_all() def do_key_press_event(self, event): #def on_key_press_event(self, widget, event): """ Call the method of the parent 'gtk_application_set_accels_for_action' does not work. """ # Important! Gtk.ApplicationWindow.do_key_press_event(self, event) # if event.keyval == Gdk.KEY_Escape: self.close() return False class NoActionApplication(Gtk.Application): def __init__(self): Gtk.Application.__init__(self) def do_activate(self): # ApplicationMenu menu = Gio.Menu() menu.append("_Quit", "app.quit_action") self.set_app_menu(menu) self.set_accels_for_action("app.quit_action", ["<Control>Q"]) # Action quit_action = Gio.SimpleAction(name="quit_action") quit_action.connect("activate", self.on_quit_action) self.add_action(quit_action) # self.window = NoActionWindow(self) def on_quit_action(self, action, parameter): self.quit() app = NoActionApplication() app.run()
上記 Important 部を無効にすると Ctrl+Q で終了できない。
このオーバーライドは親の do_key_press_event を呼ぶ必要がある。
connect メソッドならその必要は無いようだ。
こんなしょーもないことを解決するのに三時間くらい使っちまったぜ。
GtkApplication 側に問題があると思いこんでしまうもの、こういう場合。
この連休でアレを完成させるつもりだったけど無理かも。