【问题标题】:Should a PyGTK application's main class extend Gtk.Window or not?PyGTK 应用程序的主类是否应该扩展 Gtk.Window?
【发布时间】:2015-01-08 15:29:25
【问题描述】:

非常是 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()

源代码: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/

我了解一个类扩展另一个类/将其用作基础对象的原理,但我不清楚一种方法相对于另一种方法的好处,谁能解释一下?

【问题讨论】:

    标签: python class object window pygtk


    【解决方案1】:

    在 pygtk 中,您可以从任何小部件继承,但在这种情况下,第二个实现比第一个具有优势。 OOP 编程中的一个重要概念是封装,它指的是如何访问类属性/属性和方法。在代码的两个实现上,窗口是公共的,程序员可以直接访问窗口。 OOP 编程是因为我们可以轻松地与对象交互,在第一个实现中,如果您想获取窗口实例的标题,您必须输入:

    base.window.get_title()
    

    但是第二次你必须输入:

    PyApp().get_title()
    

    您也可以将自定义属性、属性和方法附加到您需要的第二个实现或覆盖从父级继承的这些东西,例如,您可以将 main 方法添加到 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()
    

    在任何属性、属性和方法将其范围更改为私有之前,请加双下划线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2016-05-17
      • 1970-01-01
      • 2010-09-07
      • 2019-08-29
      • 2013-02-02
      • 1970-01-01
      相关资源
      最近更新 更多