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
相关产品推荐
相关产品推荐

