我正在使用grid
几何体在Python / Tkinter中设计简单的输入对话框,并获得一些意外的行为。当我开始使用这段代码时:
winAddNew = tk.Toplevel()
winAddNew.title('Add New Customer')
lblName = tk.Label(winAddNew,
anchor=tk.W,font=fntNormal,
text='Enter the complete name of the customer:')
entName = tk.Entry(winAddNew,
justify=tk.LEFT, font=fntNormal, width=20,
textvariable=ctrlNewCustomerName)
lblID = tk.Label(winAddNew,
anchor=tk.W,font=fntNormal,
text='Enter a unique three-character ID:')
entID = tk.Entry(winAddNew,
justify=tk.LEFT, font=fntNormal, width=8,
textvariable=ctrlNewCustomerID)
lblName.grid(row=0,column=0,columnspan=2,sticky=tk.W,padx=10,pady=(10,0))
entName.grid(row=1,column=0,columnspan=2,sticky=tk.W,padx=10,pady=(5,0))
lblID.grid(row=2,column=0,sticky=tk.W,padx=(10,0),pady=10)
entID.grid(row=2,column=1,sticky=tk.W,padx=(0,10),pady=10)
...这就是渲染窗口在我的机器上的外观(Windows 7,Python 2.7.3)。请注意,绿线实际上并不存在,我只是使用它们来布置我认为应该是行和列的位置。
到目前为止一切顺利。现在,我想将width
的{{1}}设置为entName
,以便为客户名称输入更多可见空间。因为我将60
设置为columnspan
,并且因为2
选项的每个小部件都设置为tk.W
,所以我期望增加{{1}的宽度除了扩大条目小部件本身以及相应地扩大窗口之外,它将没有任何效果。所有其他小部件相对于彼此的位置应该保持不变 - 对吗?
不。扩展sticky
也会导致entName
被推离entName
:
那我错过了什么?为什么entID
不会停留在原来的位置?是否有某种方法可以使它保持原位,除了阻止第2排进入自己的框架?
答案 0 :(得分:7)
当你使条目小部件更大时,Tkinter必须为第0列或第1列分配额外的空间。它根据每列的“权重”来执行此操作。
由于您未明确设置权重,因此所有列的默认权重均为零。但是,在你的情况下,必须要有所成长。如果没有列有重量,Tkinter会选择第一列。这解释了为什么entID被推翻 - 第一列变宽以容纳小部件条目小部件。
如果为第1列赋予权重1,则任何额外空间都将分配给该列,使第0列足够宽以容纳限制该列的任何内容(即:任何不跨越列的小部件) 。您可以使用grid_columnconfigure
命令执行此操作。
例如:
winAddNew.grid_columnconfigure(1, weight=1)
请注意,重量可以是任何正整数;它代表一个比例。因此,例如,如果将列0设置为1并将列1设置为2,则列1将被赋予两倍于给定列0的额外空间量。
Tkinter在记录此行为方面表现不佳。最终文档位于Tcl / Tk手册页中。具体来说,请参阅网格手册页中的Grid Algorithm。