如何在 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 还是 gridplace,以及您如何配置它们。因此,另一种使框架变宽的方法是使用非默认选项,这些选项会导致框架增大或缩小以适应给定的 space。

如果你想指定一个明确的大小并忽略 tkinter 的自动调整大小,你可以通过关闭 geometry propagation 然后设置 widthheight 框架的参数。根据您使用的是 grid 还是 pack,您可以使用 False 参数调用 grid_propagatepack_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()

结果: