【问题标题】:Python Tkinter grid-geometry sticky setting not effective(?)Python Tkinter 网格几何粘性设置无效(?)
【发布时间】:2013-03-09 22:50:07
【问题描述】:

我正在使用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)。请注意,绿线实际上并不存在,我只是用它们来布置我认为应该是行和列的位置。

到目前为止一切顺利。现在我想将entNamewidth 设置为60,以提供更多可见的空间来输入客户名称。因为我将其columnspan 设置为2,并且因为每个小部件都使用tk.W 设置sticky 选项,所以我希望增加entName 的宽度除了扩大入口小部件本身,并相应地扩大窗口。所有其他小部件的相对位置应该保持不变——对吧?

不。扩大entName 也会导致entID 被推离lblID

那么我错过了什么?为什么entID 不留在原来的位置?除了将第 2 行阻挡在自己的框架中之外,还有什么方法可以让它保持原位吗?

【问题讨论】:

  • 我认为最终,网格也允许一些填充。正如您已经说过的,将其放入自己的框架中可能是您​​会找到的最强大的解决方案。当然,您也可以尝试增加大条目的列跨度,但我不知道这是否真的会为您带来很多好处。

标签: python python-2.7 tkinter


【解决方案1】:

当你让入口小部件变大时,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

【讨论】:

  • 宾果游戏。我之前用其他显示器显式地修改了权重,但没有意识到默认情况下它仍然隐式发生。非常感谢!
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多