python-3.x TKInter窗口小部件具有不同的宽度,即使在设置相同的宽度之后

jm81lzqq  于 2023-04-22  发布在  Python
关注(0)|答案(1)|浏览(137)

我试图在tkinter中构建一个小窗口,但我观察到即使设置为相同的宽度,不同的widget也会采用不同的宽度。下面是我在运行代码时看到的输出:

第一行中的黑色小部件是Entry小部件,声明如下**(width=30)**:

entry=Entry(root,width=30,font=('arial',14,'bold'),bd=0,bg='black',fg='white')
entry.grid(row=0,column=0,padx=0,pady=0,ipadx=0,ipady=0,columnspan=10)

第二行中的彩色小部件是如下定义的标签小部件**(width=3 * 10 widgets = 30)**:

label=Label(root,width=3,font=('arial',14,'bold'),bg=<different_colors>)
label.grid(row=1,column=<increasing columns>,padx=0,pady=0ipadx=0ipady=0)

第三行中的紫色小部件也是一个标签小部件,定义如下**(width=30)**:

biglabel=(root,width=30,font=('arial',14,'bold'),bg='purple')
biglabel.grid(row=2,column=0,padx=0,pady=0ipadx=0ipady=0,columnspan=10)

根据上面提到的宽度,所有3行不是都应该是相同的宽度吗?但是从输出图像中可以看到,所有3行的宽度都不同。
问题:
1.有人能解释一下这种行为的原因吗?
1.如何使不同的小部件在整个应用程序中遵循网格/使用什么而不是宽度来确定性地使它们具有相同的大小?因为我需要根据条目中键入的内容添加小部件,并且不希望它具有不同的大小。现在窗口扩展以容纳第二行,当第二行在条目中键入内容后添加时。可以通过在这里在线执行我的代码来查看交互式输出:https://replit.com/@KCKotak/TKinter-experiment#main.py
要测试的完整代码示例:

from tkinter import *

root=Tk()

def add_text_label(r=0,c=0,bgcolor='white'):
    text_label=Label(root, width=3, font=('arial',14,'bold'), bg=bgcolor)
    text_label.grid(row=r,column=c,padx=0,pady=0,ipadx=0,ipady=0)

root.geometry('-15-35')
root.title('experiment')
root.config(bg='white')

# first row: black entry as seen in output image. **width=30**
text_entry=Entry(root,width=30,font=('arial',14,'bold'),bd=0,bg='black',fg='white')
text_entry.grid(row=0,column=0,padx=0, pady=0,ipadx=0,ipady=0,columnspan=10)

# second row: colorful labels. **width=3 x 10 = 30**
add_text_label(1,0,'red')
add_text_label(1,1,'blue')
add_text_label(1,2,'yellow')
add_text_label(1,3,'orange')
add_text_label(1,4,'green')
add_text_label(1,5,'red')
add_text_label(1,6,'blue')
add_text_label(1,7,'yellow')
add_text_label(1,8,'orange')
add_text_label(1,9,'green')

# third row: purple label. **width=30**
big_label=Label(root, width=30, font=('arial',14,'bold'), bg='purple')
big_label.grid(row=2,column=0,padx=0, pady=0,ipadx=0,ipady=0,columnspan=10)

root.mainloop()
9rnv2umw

9rnv2umw1#

有人能解释一下这种行为的原因吗?
简单来说,EntryLabel小部件并不相同,并且某些选项可能具有不同的值。例如,Entry小部件默认的highlightthickness为1,但Label的相同选项可能为零。此外,标签有一个padxpady选项,默认情况下可能为非零。Entry小部件没有此选项。
如果将borderwidthhighlightthickness设置为0(零),并在Label小部件上将padx设置为零,然后一切都可能排队。在我的机器上,我仍然得到一个2像素的差异之间的第一行和其他两行。可能有另一种选择我'我忘记了,或者它可能只是一个Entry小部件自然会比Label稍大。
如何使不同的小部件遵循整个应用程序的网格
使用sticky属性,以便小部件填充分配给它们的空间。您还可以在所有列上使用uniformweight选项,以强制它们具有完全相同的宽度。例如:

entry.grid(..., sticky="nsew")
...
label.grid(...,sticky="nsew")
...
biglabel.grid(..., sticky="nsew")
...
root.grid_columnconfigure((0,1,2,3,4,5,6,7,8,9), weight=1, uniform="a")

注意:uniform"a")的具体值无关紧要。唯一重要的是所有列使用相同的值。

相关问题