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

Tkinter Canvas工作区小于控件及网格矩形绘制异常求助

Tkinter工作区尺寸匹配与矩形显示不全修复

一、让窗口geometry参数对应Canvas工作区

默认root.geometry("600x600+100+100")设置的是整个窗口的总尺寸(包含标题栏和边框),要让内部Canvas的可绘制工作区刚好为600x600,需按以下步骤调整:

  • 创建窗口后先调用root.update_idletasks(),触发窗口布局计算,获取边框和标题栏占用的额外尺寸
  • 基于额外尺寸计算总窗口大小,重新设置geometry,确保内部工作区符合预期

二、修复第二列矩形显示不全问题

原代码中Canvas仅执行pack(),未配置填充和扩展属性,导致Canvas不会随父容器Frame扩展,超出Canvas范围的内容被截断。只需给Canvas的pack方法添加fill=BOTH和expand=1参数,让Canvas填满整个Frame。

修改后的完整代码

from tkinter import Tk, Canvas, Frame, BOTH

class Flowchart(Frame):
    def __init__(self):
        super().__init__()
        self.pack(fill=BOTH, expand=1)
        self.canvas = Canvas(self)
        # 让Canvas填满整个父容器,避免内容被截断
        self.canvas.pack(fill=BOTH, expand=1)

    def rec_with_text(self, x1: int, y1: int, text: str):
        my_test = self.canvas.create_text(x1+1, y1, text=text, width=100, anchor="nw")
        coords_text = self.canvas.bbox(my_test)
        self.canvas.create_rectangle(x1, y1, x1+100, coords_text[3], width=2)

def main():
    root = Tk()
    # 更新窗口布局,获取边框和标题栏的额外尺寸
    root.update_idletasks()
    extra_width = root.winfo_width() - root.winfo_reqwidth()
    extra_height = root.winfo_height() - root.winfo_reqheight()
    # 设置总窗口大小,确保内部工作区为600x600
    root.geometry(f"{600 + extra_width}x{600 + extra_height}+100+100")
    
    ex = Flowchart()
    ex.master.title("Рисуем линии 2")
    ex.rec_with_text(100, 100, "There will also be a tex0")
    ex.rec_with_text(300, 100, "There will also be a tex1")
    ex.rec_with_text(300, 200, "There will also be a tex2")
    root.mainloop()

if __name__ == '__main__':
    main()

关键修改说明

  • Canvas扩展配置:self.canvas.pack(fill=BOTH, expand=1) 使Canvas随Frame自动拉伸,所有绘制内容都能在可视区域内显示。
  • 工作区尺寸校准:通过update_idletasks()获取窗口的额外占用尺寸,调整geometry参数后,内部可绘制区域精准匹配600x600的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:35:31