2012-04-26 36 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) 

一旦定义了宽度和高度,框架显示正常。 如果您发布了一些帧的内容,如果不是这个问题,它可能会更清晰。