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

标签 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()

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

源代码:http://zetcode.com/gui/pygtk/firststeps/

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

最佳答案

在 pygtk 中,您可以从任何小部件继承,但在这种情况下,第二个实现比第一个实现具有优势。 OOP 编程中的一个重要概念是封装,它指的是如何访问类属性/属性和方法。在这两种代码的实现上,窗口是公共(public)的,程序员可以直接访问该窗口。 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()

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

关于python - PyGTK 应用程序的主类是否应该扩展 Gtk.Window?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27843676/

相关文章:

PHP 数组警告 : Creating default object from empty value

Javascript 函数 Object.keys 无法正常工作

python - 使用 List 进行 NumPy 索引?

python - Python 亲和性传播中的相似度矩阵

python - SSL 错误 : bad record mac - Managing multiple connections with PostgreSQL and Python multiprocessing

java - 在 junit 测试中获取一个类作为 javax.lang.model.element.Element

node.js - 如何在另一个类中使用类函数?

C++ 类模板类型 std::list

javascript - 在 python 中使用 json.loads() 的问题

apache-flex - 对象和字符串对象有什么区别