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

问题描述 投票:0回答:3

我正在尝试在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()
python tkinter widget width frame
3个回答
0
投票

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

1的输出是由于帧上除了空标签之外没有任何东西。 (如果没有标签,它将仍显示1

要以200的形式获得输出,请将grid_propagate标志设置为False(设置了height和widht参数后为only,如下:

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

0
投票

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

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

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

[宽度还取决于它如何添加到显示器-是使用pack还是gridplace,以及如何配置它们。因此,使框架变宽的另一种方法是使用非默认选项,该选项会导致框架增大或缩小以适应为其提供的空间。

如果要指定一个明确的大小,而忽略tkinter的自动调整大小,则可以通过关闭几何传播来实现。根据使用的是grid还是pack,可以使用grid_propagate参数调用pack_propagateFalse以禁用传播(place不支持几何传播)。请注意,这通常是最不理想的解决方案,因为它需要您做更多的工作来创建响应式UI。


0
投票

您需要告知行和列以扩展框架所在的位置。这是通过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()

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.