2016-04-23 9 views
0

ここに、私のクラスが優先権を表現しています。 'preferences.glade'からgladeレイアウトを読み込みます。対応するボタンがアクティブになると、btn_cancel_clicked_cbおよびbtn_ok_clicked_cbが呼び出されます。しかし、self.destroy()は何もしません。誰かがボタンをクリックした後にこのダイアログを破壊する方法を説明することはできますか?PyGIウィンドウが破壊されない

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() 

それはそのようなメインウィンドウから開始します:

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

'self'は' self.window'ではありません。実際、 'self'のダイアログ部分が使用されることはないので、' Gtk.Dialog'をサブクラス化することは役に立ちません! GTK +の新しいバージョンが必要な場合は、コンポジットウィジェットテンプレートとしてダイアログを作成し、そのようにクラスを構築することができます。さもなければ、サブクラスを取り除き、代わりに 'window.destroy()'を呼び出してください。 – andlabs

+0

@andlabsありがとう! –

答えて

2

selfself.windowではありません。実際には、selfのダイアログ部分が使用されることはないので、あなたのケースのGtk.Dialogをサブクラス化することは無意味です! GTK +の新しいバージョンが必要な場合は、コンポジットウィジェットテンプレートとしてダイアログを作成し、そのようにクラスを構築することができます(これをPythonで行う方法はわかりません)。それ以外の場合は、サブクラスを取り除き、代わりにwindow.destroy()を呼び出します(が実際にGtk.Dialogの場合はself.run()window.run())。

関連する問題