我正在尝试在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_propagate
标志设置为False(设置了height和widht参数后为only,如下:
frame = Frame(..., width=200)
frame.grid(row=0, column=0)
frame.grid_propagate(False)
宽度返回1,因为尚未绘制窗口。实际宽度取决于绘制的窗口,因为实际宽度取决于许多实际绘制窗口之前无法得知的因素。
如果在调用root.update()
以强制绘制窗口之前调用Frame.winfo_width()
,您将看到它显示实际值。
关于如何改变宽度,这个问题回答的范围太广。通常,直接设置框架的宽度是不明智的。默认情况下,Tkinter会自动调整框架的大小以适合其子代。因此,使框架变宽的一种方法是添加更多的小部件。
[宽度还取决于它如何添加到显示器-是使用pack
还是grid
或place
,以及如何配置它们。因此,使框架变宽的另一种方法是使用非默认选项,该选项会导致框架增大或缩小以适应为其提供的空间。
如果要指定一个明确的大小,而忽略tkinter的自动调整大小,则可以通过关闭几何传播来实现。根据使用的是grid
还是pack
,可以使用grid_propagate
参数调用pack_propagate
或False
以禁用传播(place
不支持几何传播)。请注意,这通常是最不理想的解决方案,因为它需要您做更多的工作来创建响应式UI。
您需要告知行和列以扩展框架所在的位置。这是通过columnconfigure()
和rowconfigure()
完成的。然后,您需要用sticky='nsew'
指示框架粘到所有侧面。将小部件添加到框架与其他任何容器都没有不同。只需告诉窗口小部件在框架中即可。
我看到的一个潜在问题是您正在以下行覆盖Frame()
:Frame = LabelFrame(root, text="Test", width = 200)
。这是一个很好的示例,为什么您不应该使用import *
。而是执行import tkinter as 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()
结果: