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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:39:54