2015-10-01 42 views
3

如果我想簡單地用語句創建一個Tkinter的GUI,我可以這樣做:Python:爲什麼Tkinter類實例化必須使用Frame?

from Tkinter import * 
root = Tk() 
root.title("Test Window") 
tkFrame = Frame(root) 
tkButton = Button(tkFrame) 
[...] 

的文檔,但是,建議,Tkinter的一個類定義中,繼承一個框架構件:

class App(Frame): 
    [...] 

我想明白這是爲什麼。爲什麼我們不能將框架的容器,窗口分類?看起來,第一個例子中的語句是做什麼的,爲什麼不在類定義中呢?

EDIT(以下布萊恩·奧克利的回答):

我想在Tkinter的最高水平,我以爲是TK()(雖然我所遇到的引用,說明框架是頂級實例,但是不要緊)。事實上,下面將創建一個窗口:

from Tkinter import * 
class Application(Tk): 
    pass 
app = Application() 
app.mainloop() 

...但只要我嘗試在新窗口中添加小工具我要麼得到錯誤或兩個窗口,與窗口小部件,這取決於我如何結構碼。下面是將產生一個第二窗口與按鈕一個基本的例子:

from Tkinter import * 
class Application(Tk): 
    tkBtn = Button() 
    tkBtn.pack() 
app = Application() 
app.mainloop() 

再說了,使用self__init__等,產生錯誤。有人可以指向我在最高級別實例化Tkinter的代碼嗎?就像我看到的所有Frame亞類,但在最高級別?

+0

任何引用您已經有人說「Frame」是「Tkinter的最高級別」是錯誤的。 –

回答

5

沒有什麼說tkinter類必須從框架繼承。您可以繼承任何tkinter小部件或任何其他類。如果您發現了其他文檔,則說明文檔有誤。使用Frame是合乎邏輯的選擇,因爲它被設計爲其他小部件的容器,但它不是唯一的選擇。

我個人從框架繼承,因爲我覺得它很方便。我的一些GUI需要能夠打開多個相同的窗口。通過將我的主代碼放在一個框架中,我可以創建多個窗口,只需創建框架的多個實例,然後將它們打包到小部件中即可。

當您從Tk繼承時,您只能擁有一個實例。在現實世界中,這通常就夠了,這樣做絕對沒有錯。由於我親自編寫了相當數量的tkinter程序,讓它們都開始完全相同對我來說很方便。

另一個不錯的選擇是Canvas,因爲您可以輕鬆地添加背景圖片,這不是Frame可以做的事情。底線:你絕對是而不是需要從Frame繼承。繼承你想要的任何東西。


(下面寫着響應原題的編輯)

在參考這個代碼:

from Tkinter import * 
class Application(Tk): 
    tkBtn = Button() 
    tkBtn.pack() 
app = Application() 
app.mainloop() 

你看到兩個窗口的原因是你不能正確創建課程。在創建小部件之前,您需要調用超類的__init__方法,因爲這實際上創建了根窗口。因爲你不這樣做,你最終會得到兩個窗口。當你將一個按鈕添加到一個尚未構建的根窗口時,你會得到一個隱式創建的,當你的子類完成初始化時,你會得到另一個。

的解決方案是不走捷徑,而是正確初始化類:

from Tkinter import * 
class Application(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     tkBtn = Button() 
     tkBtn.pack() 
app = Application() 
app.mainloop() 

請注意,這不是一個具體的TKinter的問題。當進行子類化時,除非你有明確的理由不這樣做,否則總是應該調用超類的方法。

你問工作的例子,這裏有一對夫婦:

你可能也想讀的問題的答覆Inheriting from Frame or not in a Tkinter application

+0

@DhaLee:我已經更新了我的答案以解決您的其他問題。 –

相關問題