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

Tkinter窗口调整无法保持正方形:Canvas高度设置无效求助

问题分析与解决方案

你的代码问题主要有两个:

  1. 你绑定的是Canvas的<Configure>事件,但Canvas通过pack(expand=True, fill="both")设置为自动填充整个窗口,修改Canvas的height会被布局规则直接覆盖,所以看不到效果。
  2. 你的目标是让整个窗口保持正方形,因此应该监听主窗口的大小变化,而非Canvas的。

修正后的代码

import tkinter as tk

def resize(event):
    # 防抖处理:避免拖动窗口时频繁触发调整导致抖动
    if hasattr(resize, "after_id"):
        root.after_cancel(resize.after_id)
    # 延迟200ms执行调整,确保用户调整动作完成
    resize.after_id = root.after(200, adjust_window_size)

def adjust_window_size():
    # 获取当前窗口的宽高
    current_width = root.winfo_width()
    current_height = root.winfo_height()
    # 取较小值作为正方形的边长
    square_size = min(current_width, current_height)
    # 设置窗口为正方形,同时保留当前位置避免窗口移位
    root.geometry(f"{square_size}x{square_size}+{root.winfo_x()}+{root.winfo_y()}")

root = tk.Tk()
root.geometry("600x600")  # 初始设置为正方形

red = "#ff7663"
canvas = tk.Canvas(root, background=red)
canvas.pack(expand=True, fill="both")

# 绑定主窗口的大小变化事件
root.bind("<Configure>", resize)

root.mainloop()

关键修改说明

  • 事件绑定目标切换:将<Configure>事件绑定到主窗口root,而非Canvas,这样才能控制整个窗口的大小。
  • 防抖机制:使用after和after_cancel实现防抖,避免拖动窗口时频繁触发调整逻辑,导致窗口抖动。
  • 窗口大小调整逻辑:取当前窗口宽高的最小值作为正方形边长,通过geometry方法设置窗口大小,同时保留窗口的位置参数,防止窗口意外移位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:25:17