gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:21:33 25 4
gpt4 key购买 nike

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

enter image description here

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

没有。加宽 entName 也会导致 entID 被推离 lblID:

enter image description here

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

最佳答案

当您使条目小部件变大时,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在网格手册页中。

关于Python Tkinter 网格几何粘性设置无效(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com