Python Tkinter网格几何粘滞设置无效(?)

JDM*_*JDM 4 python tkinter python-2.7

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

...这就是渲染窗口在我的机器上的外观(Windows 7,Python 2.7.3).请注意,绿线实际上并不存在,我只是使用它们来布置我认为应该是行和列的位置.

在此输入图像描述

到现在为止还挺好.现在我想设置widthentName高达60,给更多的可视空间,输入客户名称.因为我有它的columnspan设置2,并且因为每个小部件都是tk.Wsticky选项设置的,所以我期望增加宽度entName除了扩大条目小部件本身以及相应地扩大窗口之外没有任何效果.所有其他小部件相对于彼此的位置应保持不变 - 对吗?

不.扩大entName也导致entID被推离lblID:

在此输入图像描述

那我错过了什么?为什么不entID留在原地?是否有某种方法可以让它保持原位,除了阻止第2排进入自己的框架?

Bry*_*ley 7

当您使条目小部件更大时,Tkinter必须为列0或列1分配额外的空间.它根据每列的"权重"执行此操作.

由于您尚未明确设置权重,因此所有列的默认权重均为零.但是,在你的情况下,必须要有所成长.如果没有列有重量,Tkinter会选择第一列.这解释了为什么entID被推翻 - 第一列变宽以适应小部件条目小部件.

如果为第1列赋予权重1,则将为该列分配任何额外空间,使第0列足够宽以容纳限制该列的任何内容(即:任何不跨越列的小部件).您可以使用该grid_columnconfigure命令执行此操作.

例如:

winAddNew.grid_columnconfigure(1, weight=1)
Run Code Online (Sandbox Code Playgroud)

注意,权重可以是任何正整数; 它代表一个比例.因此,例如,如果将列0设置为1并将列1设置为2,则列1将被赋予两倍于给定列0的额外空间量.

Tkinter在记录这种行为方面表现不佳.最终文档位于Tcl/Tk手册页中.具体来说,请参见网格手册页中的网格算法.

  • 答对了。我之前已经在其他显示器上显式修改了权重,但没有意识到默认情况下它仍然隐式发生。非常感谢! (2认同)