Python ttk Frame设置width而不受子控件影响

tkinter真是折磨人,现在是为了布局,需要用到frame,但是它有个特点:

tkinter中窗口,框架容器,控件如果不设置宽度高度,则会根据其中的内容自动设置宽度高度
框架容器设置了宽度高度,如果其内存在控件,则宽度高度失效,自动适应控件大小
如果窗口,框架容器,控件中没有内容,宽度和高度为默认的最小尺寸(可能看不到)

参考自:tkinter中ttk控件的width-height设置

所以,即使给他设置了width,他也会被子控件的大小给覆盖。比如下面这样:

import tkinter
from tkinter import ttk

root = tkinter.Tk()

style = ttk.Style()
style.configure("other.TFrame", font=("宋体", 20))

secondLine = ttk.Frame(master=root, width=500, height=100, style="other.TFrame")
# secondLine.pack_propagate(0) 关键在这句
style.configure("secondTitle.TLabel", font=("宋体", 20))
eyeViewLabel = ttk.Label(secondLine, text="你好:", style="secondTitle.TLabel")
eyeViewLabel.pack(side='left', anchor='w')
secondLine.pack()

secondLine.update()  # 刷新,才能获取宽度
print(secondLine.winfo_width())
root.mainloop()

获取到的宽度是85。设置的width=500压根没用
在这里插入图片描述
后面我就想到既然受子控件影响,那就设置子控件的宽度,结果也不行,Label的宽度单位是字符,不是像素点,字符的宽度不好把握呀,没法拿来确定宽度。

解决方案

终于查到资料:tkinter - 创建尺寸由像素尺寸定义的标签小部件(包含文本)
这里的回答提到了这句:secondLine.pack_propagate(0)
按照他的解释,这句话的作用是:禁止子控件重置其尺寸。实测真实有效。但该函数的具体作用没有查到官方解释,源码也不太看得懂。

将上面代码的这句话取消注释再跑,就可以实现了:
在这里插入图片描述

### 关于 `ttk.Frame` 的使用方法 `ttk.Frame` 是 Tkinter 中的一个容器控件,用于组织其他小部件。通过设置样式和其他属性,可以实现更灵活的布局设计。 以下是关于如何使用 `ttk.Frame` 的详细说明以及示例代码: #### 基础用法 `ttk.Frame` 可以作为一个独立的小部件来承载其他组件。它的基本参数包括但不限于以下内容: - **master**: 容器所在的父窗口或框架。 - **style**: 设置样式的名称,可以通过 `Style()` 配置不同的外观效果。 - **width/height**: 指定宽度和高度(注意,在网格管理器中这些值可能会被忽略)。 配置样式的具体方式如下所示[^1]: ```python from tkinter import * from tkinter import ttk root = Tk() # 创建并配置样式 s = ttk.Style() s.configure("Red.TFrame", background='red') # 初始化 Frame 并应用样式 frame = ttk.Frame(root, style="Red.TFrame", width=200, height=200) # 将 Frame 放入布局 frame.grid(column=0, row=0) root.mainloop() ``` 上述代码展示了如何定义一个红色背景的 `ttk.Frame`,并通过 `grid` 方法将其放置到主窗口中的指定位置。 --- #### 添加控件至 `ttk.Frame` 除了作为单独的显示区域外,`ttk.Frame` 还常用来容纳其他控件。例如,可以在其中嵌套按钮、标签或其他复杂结构[^3]。 下面是一个完整的例,演示了如何在一个自定义样式的帧内添加多个控件: ```python import tkinter as tk from tkinter import ttk # 主窗体初始化 root = tk.Tk() root.title("ttk.Frame 示例") # 自定义样式 s = ttk.Style() s.configure('My.TFrame', background='#e1f5fe') # 浅蓝色背景 # 创建 Frame main_frame = ttk.Frame(root, padding=(10, 10), style='My.TFrame') main_frame.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W)) # 向 Frame 内部添加 Label 和 Button 控件 label_text = "这是一个带有控件Frame" label = ttk.Label(main_frame, text=label_text) label.grid(row=0, column=0, pady=10) button = ttk.Button(main_frame, text="点击我") button.grid(row=1, column=0, pady=10) # 调整列权重以便扩展适应窗口大小 root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) root.mainloop() ``` 此程序创建了一个浅蓝色背景的 `ttk.Frame`,并在其内部布置了一段文字提示 (`Label`) 和一个交互按钮 (`Button`)。 --- #### 样式定制与高级功能 如果希望进一步增强界面美观度,则可通过修改主题或者调整特定属性完成个性化需求[^5]。例如更改边距 (padding) 或者引入更多复杂的视觉元素。 下面是另一个实例,重点在于利用额外的空间填充选项优化整体观感: ```python import tkinter as tk from tkinter import ttk root = tk.Tk() root.geometry("400x300") # 设定初始尺寸 # 新建 Style 实例对象 custom_style = ttk.Style() custom_style.theme_use('default') # 默认主题 custom_style.configure( 'Custom.TFrame', borderwidth=2, relief='groove' # 边框凹槽效果 ) outer_frame = ttk.Frame(root, style='Custom.TFrame', padding=[20, 15]) outer_frame.place(relx=0.5, rely=0.5, anchor=tk.CENTER) inner_label = ttk.Label(outer_frame, text="带边界线的 Frame 效果") inner_label.pack(pady=20) root.mainloop() ``` 这里设置了具有明显轮廓线条的外部框架,并且居中定位整个 UI 结构。 --- #### 总结 以上分别介绍了基础语法、组合运用场景以及进阶美化技巧等内容。借助 `ttk.Frame` 提供的强大灵活性,开发者能够轻松构建层次分明的应用图形界面。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsjweiyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值