2015-01-08 36 views
2

我是 Python編程新手,目前正在開發一個小型的PyGTK應用程序。PyGTK應用程序的主類是否應該擴展Gtk.Window?

在搜索並閱讀各種在線教程後,我對定義主應用程序的類感到有點困惑。我已經看到了兩種不同的方法分別是:

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/

我明白了一個的主要類擴展另一個/使用它作爲一個基礎對象,但我不明白在這裏的一種方法的好處,誰能解釋一下嗎?

回答

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

任何屬性之前雙下劃線屬性和methodes變化這些私人的範圍。

相關問題