PyGI window 不破坏

PyGI window not destroying

这是我的 class,代表偏好。它从 'preferences.glade' 加载林间空地布局。 btn_cancel_clicked_cb 和 btn_ok_clicked_cb 在相应的按钮被激活时被调用。但是 self.destroy() 什么都不做。有人可以解释一下单击按钮后如何销毁此对话框吗?

from gi.repository import Gtk
from common import Prefs

class ViewPrefs(Gtk.Dialog):
    def __init__(self):
        Gtk.Dialog.__init__(self)
        self.builder = Gtk.Builder()
        self.builder.add_from_file("preferences.glade")
        self.builder.connect_signals(self)

        self.rb_input=self.builder.get_object("rb_input")
        self.rb_select=self.builder.get_object("rb_select")

    def run(self, *args):
        window = self.builder.get_object("window_prefs")
        window.show()
        window.connect('destroy', Gtk.main_quit)
        Gtk.main()

    def register_observer(self, controller):
        self.controller = controller

    def btn_cancel_clicked_cb(self,widget):
        self.destroy()

    def btn_ok_clicked_cb(self,widget):
        active = [r for r in self.rb_input.get_group() if r.get_active()][0]
        input_type=active.get_label().lower()
        self.controller.set_prefs(Prefs(input_type=input_type))
        self.destroy()

它从主要的 window 开始,像这样:

   prefsview=ViewPrefs()
   prefsview.register_observer(self.controller)
   prefsview.run()

self 不是 self.window。事实上,subclassing Gtk.Dialog 对于你的情况是没有用的,因为 self 的对话部分从未被使用过!如果您需要足够新的 GTK+ 版本,您可以将对话框创建为复合小部件模板并以这种方式构建您的 class(我不知道如何使用 Python 执行此操作;抱歉) .否则,摆脱 subclass 并改为调用 window.destroy()(并且,如果 window 确实是 Gtk.Dialogwindow.run() 在您的 self.run() ).