如何在python中更改框架小部件的宽度

如何在python中更改框架小部件的宽度,python,tkinter,widget,width,frame,Python,Tkinter,Widget,Width,Frame,我试图在tkinter中调整帧的大小,但宽度不变,函数winfo_width()返回1。我怎样才能修好它 from tkinter import * root = Tk() root.geometry('400x300') Frame = LabelFrame(root, text="Test", width = 200) Frame.grid(row = 0, column = 0) label = Label(Frame, text = '').grid(row = 0, column=0

我试图在tkinter中调整帧的大小,但宽度不变,函数winfo_width()返回1。我怎样才能修好它

from tkinter import *

root = Tk()
root.geometry('400x300')
Frame = LabelFrame(root, text="Test", width = 200)
Frame.grid(row = 0, column = 0)
label = Label(Frame, text = '').grid(row = 0, column=0)


print(Frame.winfo_width()) #output is 1 instead of 200

root.mainloop()

框架可以基于其上的小部件在网格上传播,并且没有固定的尺寸

1
的输出是由于框架上除了空标签外没有其他内容。(如果没有标签,它仍将显示
1

要将输出设置为
200
,请将
grid\u propagate
标志设置为False(仅在设置高度和宽度参数后设置),如下所示:

frame = Frame(..., width=200)
frame.grid(row=0, column=0)
frame.grid_propagate(False)

宽度返回1,因为窗口尚未绘制。实际宽度取决于正在绘制的窗口,因为实际宽度取决于许多在实际绘制窗口之前无法知道的因素

如果在调用
Frame.winfo_width()
强制绘制窗口之前调用
root.update()
,您将看到它显示实际值

至于如何改变宽度,这个问题太宽泛了,无法回答。通常,直接设置帧的宽度是不明智的。默认情况下,Tkinter会自动调整框架大小以适合其子框架。因此,使框架更宽的一种方法是添加更多的小部件

宽度还取决于如何将其添加到显示器中-您使用的是
pack
还是
grid
还是
place
,以及如何配置它们。因此,使框架更宽的另一种方法是使用非默认选项,使框架增长或收缩以适应给定的空间

如果要指定显式大小并忽略tkinter的自动调整大小,可以通过关闭几何体传播,然后设置帧的
宽度
高度
参数来实现。根据使用的是
grid
还是
pack
,可以使用
False
参数调用
grid\u propagate
pack\u propagate
来禁用传播(
place
不支持几何体传播)


请注意,关闭几何体传播通常是最不理想的解决方案,因为它需要您做更多的工作来创建响应的UI。使用tkinter设计GUI的最佳方法是关注内部小部件的大小,并让tkinter为框架和窗口本身计算最有效的大小

正如其他人指出的,如何使用
grid\u propagate()
设置静态大小的框架,我将向您展示如何设置框架以自动调整大小

您需要告诉行和列展开框架所在的位置。这是通过
columnconfigure()
rowconfigure()
完成的。然后,您需要使用
sticky='nsew'
命令框架粘到所有侧面。将小部件添加到框架与任何其他容器没有什么不同。只需告诉小部件在框架中

我看到的一个潜在问题是您正在这一行上覆盖
Frame()
Frame=LabelFrame(root,text=“Test”,width=200)
。这是一个不应该使用导入
*
的好例子。相反,请将tkinter作为tk导入
,并将
tk.
前缀用于任何需要它的内容

例如:

import tkinter as tk

root = tk.Tk()
root.geometry('400x300')
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
frame = tk.LabelFrame(root, text='Test', width=200)
frame.grid(row=0, column=0, sticky='nsew')
label = tk.Label(frame, text='label').grid(row=0, column=0)
root.mainloop()
结果:

更新:

如果您确实想要一些静态的东西,请确保您同时定义了高度和宽度。如果只定义一个或另一个,则不会在窗口中看到框架

对于静态帧大小的可测试示例:

import tkinter as tk

root = tk.Tk()
root.geometry('400x300')
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
frame = tk.LabelFrame(root, text='Test', height=200, width=200)
frame.grid(row=0, column=0)
frame.grid_propagate(False)
label = tk.Label(frame, text='label').grid(row=0, column=0)

root.mainloop()
结果:


使用frame.grid\u propagate(False)后,我无法向框架中添加任何小部件。@这不太可能。grid propagate与添加小部件无关。@Mike SMT那么我如何调整框架的大小并在那里添加小部件呢?“1的输出是因为框架上除了一个空标签外没有其他内容。”这不是一条正确的语句。它是1,因为帧尚未绘制。因为它有一个子项,所以它的实际大小将大于一,并且取决于绘制窗口时使用的字体。您想将
根目录。columnconfigure(0,weight=1)
根目录。rowconfigure(0,weight=1)
添加到您的代码中。这将告诉行/列0均匀展开。然后将
sticky='nsew'
添加到
网格()
。我想补充一点,如果您使用
grid\u propagate
,则需要指定高度和宽度。仅指定宽度似乎会使屏幕空白,或者该帧在该点处的高度为零。看起来这种情况在网格和包传播中都会发生。@Mike SMT:是的,如果你关闭传播,你就要对大小负全部责任。我想最好提一下,因为OP只指定宽度。如果在使用grid_propagate后,它们的帧没有显示出来,它们可能会感到困惑。