1

私は通常、Glade を使用して GUI を設計し、一連の Builder XML ファイル (アプリケーション ウィンドウごとに 1 つのファイル) を作成します。

ここで、gtk.Window から継承し、アプリケーションのメイン ウィンドウのすべてのシグナル ハンドラを実装する MainWindow などのクラスを定義することを考えています。問題は、含まれている XML ファイルからメイン ウィンドウを取得すると、それが gtk.Window インスタンスとして返されることです。

これまでに採用したソリューションは次のとおりです。

次の方法でクラス「ウィンドウ」を定義しました

class Window():
def __init__(self, win_name):
    builder = gtk.Builder()
    self.builder = builder
    builder.add_from_file("%s.glade" % win_name)
    self.window = builder.get_object(win_name)
    builder.connect_signals(self)

def run(self):
    return self.window.run()

def show_all(self):
    return self.window.show_all()

def destroy(self):
    return self.window.destroy()

def child(self, name):
    return self.builder.get_object(name)

実際のアプリケーション コードでは、Frow Window を継承する MainWindow などの新しいクラスを定義しました。これは次のようになります。

class Main(Window):
def __init__(self):
    Window.__init__(self, "main")

### Signal handlers #####################################################

def on_mnu_file_quit_activated(self, widget, data = None):
    ...

文字列「main」は、XML Builder ファイル「main.glade」に存在する「main」と呼ばれるメイン ウィンドウを参照します (これは、私が採用することにした一種の規則です)。

問題は、たとえばクラス Foo(gtk.Window) を定義して、gtk.Window から直接継承し、builder.get_object(win_name) の戻り値を Foo に再キャストするにはどうすればよいかということです。

4

0 に答える 0