我通常使用 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”中(这是我决定采用的一种约定)。
所以问题是:如何通过定义类 Foo(gtk.Window) 直接从 gtk.Window 继承,并将 builder.get_object(win_name) 的返回值重铸为 Foo?