You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Customtkinter:获取组件真实尺寸异常问题求助

Customtkinter中CTkFrame无法获取真实尺寸的解决方法

问题根源

你遇到的winfo_height()始终返回120的问题,本质是组件布局尚未完成时就获取尺寸:

  • 刚调用grid()后,组件还没完成与父容器的布局同步,update()只能触发一次初步渲染,无法拿到最终拉伸后的真实尺寸。
  • 若父容器(你的self对象)未配置对应行列的权重,sticky="nsew"不会生效,CTkFrame会保持默认的120px尺寸。

解决方案

1. 先配置父容器的网格权重

确保父容器的行列能分配剩余空间,让CTkFrame可以被拉伸:

# 假设self是主窗口或父Frame,需先配置它的网格布局
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=1)

2. 绑定<Configure>事件动态计算尺寸

不要在初始化时一次性获取尺寸,而是绑定组件的尺寸变化事件,每次Frame大小改变时自动计算16:9比例:

# Monitor frame
self.monitorFrame = ctk.CTkFrame(self)
self.monitorFrame.grid_columnconfigure(0, weight=1)
# 你的行配置保持不变
self.monitorFrame.grid_rowconfigure(0, weight=0)
self.monitorFrame.grid_rowconfigure(1, weight=0)
self.monitorFrame.grid_rowconfigure(2, weight=0)
self.monitorFrame.grid(row=0, column=1, padx=20, pady=20, sticky="nsew")

# 绑定尺寸变化事件
def on_frame_resize(event):
    # 16:9比例为宽度:高度=16:9,用真实宽度推导高度
    real_width = event.width - 40
    target_height = int(real_width * 9 / 16)
    self.monitorFrame.configure(height=target_height)

self.monitorFrame.bind("<Configure>", on_frame_resize)

3. 修正计算逻辑

你原代码中用高度推导宽度的逻辑不符合16:9的比例定义,需根据实际需求调整:如果要固定宽高比为16:9,应该用真实宽度计算对应高度;若需求是固定高度推导宽度,则调换计算逻辑即可。

额外提示

  • 避免在组件初始化阶段频繁调用update()或update_idletasks(),这类方法可能导致布局不稳定。
  • Customtkinter组件尺寸受主题和内边距影响,若需精确计算,可先用winfo_width()/winfo_height()获取渲染后的真实尺寸,再减去组件的padx/pady配置值。

内容的提问来源于stack exchange,提问作者epi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 00:04:59