如何在 python 中更改框架小部件宽度
How can i change frame widget width in python
我正在尝试在 tkinter 中调整框架的大小,但宽度没有改变并且功能正常 winfo_width() returns 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
的输出是由于框架上除了一个空标签外什么都没有。 (如果没有Label还是会显示1
)
要获得 200
的输出,请将 grid_propagate
标志设置为 False(仅 在设置您的高度和宽度参数后),如下所示:
frame = Frame(..., width=200)
frame.grid(row=0, column=0)
frame.grid_propagate(False)
宽度返回 1,因为 window 尚未绘制。实际宽度取决于正在绘制的 window,因为实际宽度取决于许多在实际绘制 window 之前无法知道的因素。
如果您在调用 Frame.winfo_width()
以强制绘制 window 之前调用 root.update()
,您将看到它显示实际值。
至于如何改变宽度,这个问题太笼统了,不好回答。通常直接设置框架的宽度是不明智的。默认情况下,Tkinter 会自动调整框架的大小以适合其子框架。因此,使框架变宽的一种方法是添加更多小部件。
宽度还可能取决于它是如何添加到显示中的 - 无论您使用的是 pack
还是 grid
或 place
,以及您如何配置它们。因此,另一种使框架变宽的方法是使用非默认选项,这些选项会导致框架增大或缩小以适应给定的 space。
如果你想指定一个明确的大小并忽略 tkinter 的自动调整大小,你可以通过关闭 geometry propagation 然后设置 width
和 height
框架的参数。根据您使用的是 grid
还是 pack
,您可以使用 False
参数调用 grid_propagate
或 pack_propagate
来禁用传播(place
不支持几何传播)。
请注意,关闭几何传播通常是最不理想的解决方案,因为它需要您做更多的工作才能创建响应式 UI。使用 tkinter 设计 GUI 的最佳方法是关注内部小部件的大小,并让 tkinter 计算框架和 window 本身的最有效大小。
正如其他人指出的如何使用 grid_propagate()
设置静态尺寸框架,我将向您展示如何设置框架以自动调整尺寸。
您需要告诉行和列展开框架所在的位置。这是通过 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()
结果:
更新:
如果您确实想要一些静态的东西,请确保您同时定义了高度和宽度。如果您只定义一个或另一个,那么您将不会在 window.
中看到框架
对于静态帧大小的可测试示例:
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()
结果:
我正在尝试在 tkinter 中调整框架的大小,但宽度没有改变并且功能正常 winfo_width() returns 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
的输出是由于框架上除了一个空标签外什么都没有。 (如果没有Label还是会显示1
)
要获得 200
的输出,请将 grid_propagate
标志设置为 False(仅 在设置您的高度和宽度参数后),如下所示:
frame = Frame(..., width=200)
frame.grid(row=0, column=0)
frame.grid_propagate(False)
宽度返回 1,因为 window 尚未绘制。实际宽度取决于正在绘制的 window,因为实际宽度取决于许多在实际绘制 window 之前无法知道的因素。
如果您在调用 Frame.winfo_width()
以强制绘制 window 之前调用 root.update()
,您将看到它显示实际值。
至于如何改变宽度,这个问题太笼统了,不好回答。通常直接设置框架的宽度是不明智的。默认情况下,Tkinter 会自动调整框架的大小以适合其子框架。因此,使框架变宽的一种方法是添加更多小部件。
宽度还可能取决于它是如何添加到显示中的 - 无论您使用的是 pack
还是 grid
或 place
,以及您如何配置它们。因此,另一种使框架变宽的方法是使用非默认选项,这些选项会导致框架增大或缩小以适应给定的 space。
如果你想指定一个明确的大小并忽略 tkinter 的自动调整大小,你可以通过关闭 geometry propagation 然后设置 width
和 height
框架的参数。根据您使用的是 grid
还是 pack
,您可以使用 False
参数调用 grid_propagate
或 pack_propagate
来禁用传播(place
不支持几何传播)。
请注意,关闭几何传播通常是最不理想的解决方案,因为它需要您做更多的工作才能创建响应式 UI。使用 tkinter 设计 GUI 的最佳方法是关注内部小部件的大小,并让 tkinter 计算框架和 window 本身的最有效大小。
正如其他人指出的如何使用 grid_propagate()
设置静态尺寸框架,我将向您展示如何设置框架以自动调整尺寸。
您需要告诉行和列展开框架所在的位置。这是通过 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()
结果:
更新:
如果您确实想要一些静态的东西,请确保您同时定义了高度和宽度。如果您只定义一个或另一个,那么您将不会在 window.
中看到框架对于静态帧大小的可测试示例:
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()
结果: