現在作っている PyGI アプリで Window size を保存したい。
GtkApplication から起動なら delete-event で Gtk.main_quit せずに閉じる。
ちなみに delete-event は標準の「閉じる」ボタンか吐くシグナルです。
なので destroy Signal で処理しようとしたのだけど。
#!/usr/bin/env python #-*- coding:utf-8 -*- from gi.repository import Gtk, Gio class DestroyTest(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) cx, cy = self.get_size() print "initialize size {0},{1}".format(cx, cy) self.connect("delete-event", self.on_delete_event) self.connect("destroy", self.on_destroy) # Resize self.resize(320, 240) self.show_all() def on_destroy(self, widget): cx, cy = self.get_size() print "destroy size {0},{1}".format(cx, cy) def on_delete_event(self, widget, event): cx, cy = self.get_size() print "delete-event size {0},{1}".format(cx, cy) class App(Gtk.Application): def __init__(self): Gtk.Application.__init__( self, application_id="apps.test.destroy", flags=Gio.ApplicationFlags.FLAGS_NONE) self.connect("activate", self.on_activate) def on_activate(self, data=None): w = DestroyTest() w.set_application(self) if __name__ == "__main__": app = App() app.run(None) """ output initialize size 200,200 delete-event size 320,240 destroy size 200,200 """
こうなっってしまった。
破棄された後に値を得ようとしているのだからそりゃそうだ。
.NET とかなら例外、って GTK+ は C 言語だったね。
それなら delete-event で設定保持を行えばいい。
んでもって emit も destroy から変更して。
で、又困ってしまった。
#!/usr/bin/env python #-*- coding:utf-8 -*- from gi.repository import Gtk, Gio, Gdk, GdkX11 class DestroyTest(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) button = Gtk.Button("emit delete-event") button.connect("clicked", self.on_button_clicked) self.add(button) self.connect("delete-event", self.on_delete_event, button) self.show_all() def on_button_clicked(self, button, data=None): """ emit is No Close """ event = Gdk.Event(Gdk.EventType.DELETE) self.emit("delete-event", event) # Enable a Close #self.emit("destroy") def on_delete_event(self, widget, event, button): button.set_label("catch delete-event") return False class App(Gtk.Application): def __init__(self): Gtk.Application.__init__( self, application_id="apps.test.destroy", flags=Gio.ApplicationFlags.FLAGS_NONE) self.connect("activate", self.on_activate) def on_activate(self, data=None): w = DestroyTest() w.set_application(self) if __name__ == "__main__": app = App() app.run(None)
delete-event の emit だけじゃ終了してくれない。
メニューやボタンから終了するなら destroy も投げる必要あり?
GtkApplication はどうやって閉じているのだろう。
やっぱり普通に Gtk.main() を使ったほうが楽かも。