2012-04-26 48 views
0

我遇到了一個tkinter程序的問題,我有LabelFrame將一組標籤和條目分組,但是,它沒有將我的小部件分組。我對LabelFrame代碼如下:tkinter LabelFrame not attatching widgets

(編輯:我設法讓標籤顯示,但是,它不是分組我的小部件。)

root=Tk() 
message_frame=LabelFrame(root,text="testing",padx=0,pady=0,width=100,height=100).grid(padx=5,pady=10) 

message_label=Label(message_frame,text="Message").grid(row=1,column=0,sticky=W) 
pub_label=Label(message_frame,text="Public Key").grid(row=2,column=0,sticky=W) 
priv_label=Label(message_frame,text="Public Key").grid(row=3,column=0,sticky=W) 

message_entry=Entry(message_frame,textvariable=message,width=50).grid(row=1,column=1,sticky=W) 
pub_entry=Entry(message_frame,textvariable=pub_key,width=50).grid(row=2,column=1,sticky=W) 
priv_entry=Entry(message_frame,textvariable=private_key,width=50).grid(row=3,column=1,sticky=W) 

回答

2

在Tkinter的,典型的工作流是創建一個微件,然後使用一些幾何管理器兩個單獨的行放置。

如果我沒有弄錯,Tkinter小部件上的.grid方法返回None。所以如果你在創建它之後立即print message_frame,你可能會看到它是None。當您使用傳遞到下一個窗口小部件,他們假設你希望把它放在根小部件...

最簡單的解決方法是做這樣的事情:

message_frame=LabelFrame(root,text="testing",padx=0,pady=0,width=100,height=100) 
message_frame.grid(row=0,column=0) 

而且你可能想要做因爲我懷疑你真的想要pub_label =​​= None ...

+1

是的,這是問題所在。我從來沒有理解爲什麼人們將包或網格與小部件創建結合起來,那裏必須有一個教程,提倡... ... – 2012-04-26 13:08:09

+0

@BryanOakley你可以做到這一點,如果它被子類化並使'pack'和'grid'返回'self 「......但我認爲這是一件很自然的事。我懷疑任何教程都會主張,因爲檢索小部件上的任何東西都會非常困難... – mgilson 2012-04-26 13:11:18

+0

我認爲Bryan所說的是,有這麼多人使用這種容易出錯的模式必須有某個地方有人主張(或提供例子)這種用法。對於我來說,這對Smalltalk背景來說似乎很自然,但我不認爲它是如此傳播。在Python(以及其他廣泛的語言)中,你不希望「過程」返回自我。 – FabienAndre 2012-04-26 16:17:38

2

給予一定的大小屬性框:

from Tkinter import * 
root = Tk() 
message_frame = LabelFrame(root,text="testing",padx=0,pady=0,width=100,height=100).grid(row=0,column=0,padx=5,pady=10) 

一旦定義了寬度和高度,框架顯示正常。 如果您發佈了一些幀的內容,如果不是這個問題,它可能會更清晰。