PyGTK应用程序的主类是否应该扩展Gtk.Window?

时间:2015-01-08 15:29:26

标签: python class object window pygtk

非常是Python编程的新手,目前正在开发一个小型PyGTK应用程序。

在搜索和阅读各种在线教程后,我对定义主应用程序的类感到困惑。我见过的两种不同的方法是:

import pygtk
pygtk.require('2.0')
import gtk

class Base:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.show()

    def main(self):
        gtk.main()

print __name__
if __name__ == "__main__":
    base = Base()
    base.main()

src:http://www.pygtk.org/pygtk2tutorial/ch-GettingStarted.html

...或...

import gtk

class PyApp(gtk.Window):
    def __init__(self):
        super(PyApp, self).__init__()

        self.connect("destroy", gtk.main_quit)
        self.set_size_request(250, 150)
        self.set_position(gtk.WIN_POS_CENTER)
        self.show()

PyApp()
gtk.main()

src:http://zetcode.com/gui/pygtk/firststeps/

我理解一个类的主体扩展另一个/使用它作为基础对象但是我不清楚一种方法相对于另一种方法的好处,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

在pygtk中,您可以从任何小部件继承,但在这种情况下,第二个实现优先于第一个。 OOP编程中的一个重要概念是encapsolate,它指的是如何访问类属性/属性和方法。关于代码的执行,窗口是公共的,程序员可以直接访问窗口。 OOP编程是为了我们与对象轻松交互,如果你想获得必须输入的窗口实例的标题,在第一次实现时:

base.window.get_title()

但是在第二步你必须输入:

PyApp().get_title()

您也可以将自定义属性,属性和方法附加到您需要的第二个实现中,或者覆盖从父级继承的这些内容,例如,您可以将主方法添加到PyApp,如下所示:

import gtk

class PyApp(gtk.Window):
    def __init__(self):
        super(PyApp, self).__init__()

        self.connect("destroy", gtk.main_quit)
        self.set_size_request(250, 150)
        self.set_position(gtk.WIN_POS_CENTER)
        self.show()

    def main(self):
        gtk.main()

app = PyApp()
app.main()

但是如果你想在没有直接访问窗口的情况下由其他程序员分享这个类,那么首先实现更好,当然还有类似下面代码的微小变化:

import pygtk
pygtk.require('2.0')
import gtk

class Base:
    def __init__(self):
        self.__window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.__window.show()

    def main(self):
        gtk.main()

print __name__
if __name__ == "__main__":
    base = Base()
    base.main()

在任何属性,属性和方法之前将双下划线更改为私有。