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 側に問題があると思いこんでしまうもの、こういう場合。
この連休でアレを完成させるつもりだったけど無理かも。