2016-03-10 164 views
1

您好我有一個關於tkinter中的標籤的問題。Python tkinter標籤

當您使用標籤外類,你這樣做

import tkinter as tk 


root = tk.Tk() 
label = tk.Label(root, text = "something", background = "something") 
label.pack() 

然而,當它是一個類內部和代碼都像

進口Tkinter的傳統知識

class Example(tk.Frame): 

    COLOURS = [ "#f45", "#ee5", "#aa4", "#a1e433", "#e34412", "#116611", 
       "#111 eeefff", "#3aa922191", "#abbabbaaa" ] 

    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 

     self.parent = parent 


     col = 1 
     for colour in Example.COLOURS: 
     # 
     label = tk.Label(self, text=colour, background=colour) 
     # 
     label.grid(row=1, column=col) 
     col += 1 


def main(): 
root = tk.Tk() 
ex = Example(root) 
root.geometry("+300+300") 
root.mainloop() 

if __name__ == '__main__': 
    main() 

但它不應該像

label = tk.Label(self.parent, text=colour, background=colour) 

因爲self.parent會對應根? 當我嘗試這樣做時,出現一個錯誤,我只有當我在它下面有 label.grid(...)行時纔會發生錯誤(我試過打包並且工作正常)。

所以我想這個代碼

import tkinter as tk 

root = tk.Tk() 

label = tk.Label(root) 
label.grid(row=0, column=0) 

root.mainloop() 

將不能工作,但它實際上工作得很好。 所以我很困惑。誰能解釋一下?

回答

0

不,不應該是self.parent

在你給出的類例子中,類本身就是一個框架。它被設計成使得這個例子是獨立的。通過繼承Frame,您可以將該類中的所有代碼放在GUI中的任何位置。您可以將班級及其中的所有內容視爲單個自定義小部件。您可以擁有多個這些類,每個類可以被視爲一個GUI對象。

爲了完成這項工作,該類只將widgets放入其本身,而不放在其父項中。

使用Frame的sublcass的全部目的是充當其他小部件的容器。如果您不打算將其用作其他小部件的容器,則從Frame繼承是沒有意義的。

這是這個相當於無類:

import tkinter as tk 

root = tk.Tk() 
frame = tk.Frame(root) 
frame.pack(...) 
label = tk.Label(frame, text = "something", background = "something") 
label.pack(...) 

如果你想要的類把小部件的父母,你會這樣定義下面的類。請注意,它從object而不是Frame繼承:

class Example(object): 
    def __init__(self, parent): 
     self.parent = parent 
     ... 
     label = tk.Label(parent, ...) 
+0

哦,因爲我從tk.Frame類繼承我所做的類是自動的框架?或者在ex .__ init__裏初始化Frame類實際上返回一個框架對象? –

+0

此外,我實際上忘了提到在這個例子中,根(tk.Tk())被傳遞給父參數(你可能知道它)。 –

+0

是的,這是一個框架,因爲你從'Frame'繼承。 –