Tkinter窗口调整无法保持正方形:Canvas高度设置无效求助
问题分析与解决方案
你的代码问题主要有两个:
- 你绑定的是
Canvas的<Configure>事件,但Canvas通过pack(expand=True, fill="both")设置为自动填充整个窗口,修改Canvas的height会被布局规则直接覆盖,所以看不到效果。 - 你的目标是让整个窗口保持正方形,因此应该监听主窗口的大小变化,而非
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
相关产品推荐
相关产品推荐

