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

如何在Tkinter中居中显示矩形?

解决Tkinter画布矩形无法居中的问题

嘿,我太懂这种明明功能都实现了,就差个居中的糟心感了!咱们来搞定这个问题——其实Tkinter的create_rectangle和你想的有点不一样,anchor="center"对它根本不起作用,因为这个方法是靠左上角和右下角的坐标来绘制图形的,不是基于中心定位的。

核心思路:手动计算居中坐标

要让矩形居中,你需要先算出画布的中心位置,再根据矩形的尺寸反推出它的左上角坐标:

  • 画布中心X坐标:画布宽度 / 2
  • 画布中心Y坐标:画布高度 / 2
  • 矩形左上角X坐标:中心X - 矩形尺寸/2
  • 矩形左上角Y坐标:中心Y - 矩形尺寸/2

修改后的代码示例

这里我把你的代码补全并调整了居中逻辑,同时加入了窗口大小变化时自动保持居中的功能:

from tkinter import *
import random

class Draw():
    def __init__(self, can, size):
        self.can = can
        self.size = size
        # 初始化时先计算居中坐标并绘制矩形
        self.update_position()
        # 绑定点击事件(补全了你未写完的部分)
        self.can.tag_bind(self.id, "<ButtonPress-1>", self.on_click)
    
    def update_position(self):
        # 获取画布当前的实际尺寸
        canvas_width = self.can.winfo_width()
        canvas_height = self.can.winfo_height()
        # 计算矩形左上角坐标,确保居中
        start_x = (canvas_width - self.size) / 2
        start_y = (canvas_height - self.size) / 2
        # 如果是第一次绘制就创建矩形,否则更新坐标
        if hasattr(self, 'id'):
            self.can.coords(self.id, start_x, start_y, start_x+self.size, start_y+self.size)
        else:
            self.id = self.can.create_rectangle(
                start_x, start_y, start_x+self.size, start_y+self.size, 
                fill="red"
            )
    
    def on_click(self, event):
        # 示例点击逻辑:随机切换矩形颜色
        colors = ["red", "blue", "green", "yellow"]
        self.can.itemconfig(self.id, fill=random.choice(colors))

root = Tk()
root.title("居中矩形测试")
# 创建画布并填充整个窗口
canvas = Canvas(root, bg="white")
canvas.pack(fill=BOTH, expand=True)

# 创建矩形实例,尺寸设为100
rect = Draw(canvas, 100)

# 绑定画布尺寸变化事件,自动更新矩形位置
def on_canvas_resize(event):
    rect.update_position()
canvas.bind("<Configure>", on_canvas_resize)

root.mainloop()

关键细节说明

  • 为什么不用place()?因为画布上的元素是用画布专属坐标系统管理的,place()是给Tkinter组件用的,对画布内部的图形无效。
  • <Configure>事件:当窗口或画布尺寸变化时,这个事件会触发,我们可以在此时重新计算坐标,让矩形始终保持居中。
  • canvas.coords():用来更新已有图形的坐标,比重新创建图形更高效。

这样调整后,你的红色矩形不管窗口怎么缩放,都会稳稳地待在画布中心啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:28:29