如何获取CTkFrame中Canvas的像素尺寸?兼解app.title失效问题
问题解决:CustomTkinter标题不生效与Canvas尺寸获取错误
核心问题修复
1. 窗口标题不生效的修复
将直接赋值标题的代码:
app.title = 'spectrum (v1.0.0)'
改为调用title()方法:
app.title('spectrum (v1.0.0)')
CustomTkinter的CTk类继承自Tkinter的Tk,窗口标题需要通过方法设置,而非直接修改属性。
2. Canvas真实尺寸获取与对角线绘制修复
问题根源
创建并打包Canvas后,Tkinter尚未完成布局计算,此时调用size()、winfo_width()/winfo_height()会返回默认尺寸(如1x1),而非最终渲染的真实尺寸。同时,窗口 resize 时Canvas尺寸变化,需要动态更新对角线。
解决方案
- 强制布局更新:使用
app.update_idletasks()触发GUI布局计算,确保获取真实尺寸。 - 绑定Resize事件:给Canvas绑定
<Configure>事件,每次尺寸变化时重新绘制对角线。
完整修正代码
import customtkinter from tkinter import Canvas import tkinter as tk from PIL import Image, ImageTk app = customtkinter.CTk() app.title('spectrum (v1.0.0)') # 修复标题设置方式 app.minsize(800, 600) frame1 = customtkinter.CTkFrame(master=app) frame2 = customtkinter.CTkFrame(master=app) frame1.pack(padx=10, pady=10, expand=True, fill="both", side="left") frame2.pack(padx=10, pady=10, expand=False, fill="y", side="right") canvas1 = customtkinter.CTkCanvas(master=frame1, bg="black") canvas1.pack(expand=True, fill="both") # 动态更新对角线的函数 def update_diagonal(event): # 删除旧的对角线 canvas1.delete("diagonal") # 使用事件参数获取当前Canvas的真实尺寸 canvas1.create_line(0, 0, event.width, event.height, fill="#FFFFFF", tags="diagonal") # 绑定Resize事件到canvas1 canvas1.bind("<Configure>", update_diagonal) canvas2 = Canvas(master=frame1, bg="black") canvas2.pack(expand=True, fill="both") canvas3 = Canvas(master=frame2, width=400, height=800, bg="black") canvas3.pack(expand=True, fill="y") # 强制GUI完成布局计算,确保获取真实尺寸 app.update_idletasks() print(canvas1.size()) print(canvas2.size()) print(canvas1.winfo_width(), canvas1.winfo_height()) print(canvas2.winfo_width(), canvas2.winfo_height()) app.mainloop()
关键细节说明
<Configure>事件:每次Canvas尺寸变化(包括首次渲染和窗口resize)都会触发该事件,通过event.width和event.height可以直接获取当前Canvas的真实可见尺寸。update_idletasks():强制Tkinter处理所有待完成的布局任务,确保winfo_width()/winfo_height()返回的是最终渲染后的尺寸,而非默认值。- CTkCanvas的
size()方法:该方法返回的是Canvas的可滚动绘图区域尺寸,而非可见组件尺寸。若需让绘图区域匹配可见尺寸,可在update_diagonal函数中添加canvas1.config(width=event.width, height=event.height)。
内容的提问来源于stack exchange,提问作者Cosmo chief
相关产品推荐
相关产品推荐

