現在作っている 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() を使ったほうが楽かも。
