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
相关产品推荐
相关产品推荐

