我通常使用Glade设计GUI,从而生成一系列Builder XML文件(每个应用程序窗口都有一个这样的文件)。
现在我的想法是定义一个类,例如MainWindow,继承自gtk.Window并实现应用程序主窗口的所有信号处理程序。问题是,当我从包含XML文件中检索主窗口时,它将作为gtk.Window实例返回。
到目前为止我采用的解决方案如下:
我已按以下方式定义了一个“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)
在实际的应用程序代码中,我已经定义了一个新类,比如MainWindow,它继承了frow Window,看起来像
class Main(Window):
def __init__(self):
Window.__init__(self, "main")
### Signal handlers #####################################################
def on_mnu_file_quit_activated(self, widget, data = None):
...
字符串“main”指的是名为“main”的主窗口,它位于XML Builder文件“main.glade”中(这是我决定采用的一种约定)。
所以问题是:如何直接从gtk.Window继承,比如定义类Foo(gtk.Window),并将builder.get_object(win_name)的返回值重新转换为Foo?