Tkinter中Canvas如何正确设置尺寸?如何解决Canvas挤压其他控件问题
尺寸表现差异的原因
- Canvas的
width、height参数仅指代内部绘图区域的尺寸,不包含边框(borderwidth)和默认的焦点高亮边框(highlightthickness)的宽度。你设置了borderwidth=5,加上Canvas默认的highlightthickness≈2,单个Canvas的实际总宽度就是200 + 5*2 + 2*2 = 214,远超你预期的200。 - Frame的
width、height参数默认已经包含边框宽度,且Frame默认的highlightthickness为0,所以实际尺寸和你设置的数值偏差极小。 - 另外你使用grid布局时没有给父容器parent的列设置权重,grid默认会优先保证控件的实际需求尺寸,超出窗口大小的部分就会把其他控件挤出可视范围。
解决方案
- 第一步:创建Canvas时显式添加
highlightthickness=0参数,关闭默认的焦点高亮边框,减少额外空间占用。 - 第二步:给父容器的网格列设置权重,让两列平分窗口宽度,代码如下:
# 给parent的第0、1列各设置权重1,实现宽度平分 parent.grid_columnconfigure(0, weight=1) parent.grid_columnconfigure(1, weight=1) # 可选:如果需要让控件高度也随窗口自适应,加行权重配置 parent.grid_rowconfigure(0, weight=1)
- 第三步:如果需要固定控件尺寸,设置width时要预留边框的空间,比如要总宽度200的带5px边框的Canvas,width要设为
200 - 5*2 = 190。
修改后的完整可运行代码
import tkinter as tk root = tk.Tk() parent = tk.Frame(root) parent.grid(fill='both', expand=True) root.geometry('400x400') # 配置网格权重 parent.grid_columnconfigure(0, weight=1) parent.grid_columnconfigure(1, weight=1) parent.grid_rowconfigure(0, weight=1) # Canvas添加highlightthickness=0 canvas = tk.Canvas(parent, width=190, height=400, relief='raised', borderwidth=5, highlightthickness=0) canvas.grid(row=0, column=0, sticky='nsew') frame = tk.Frame(parent, width=190, height=400, relief='raised', borderwidth=5) frame.grid(row=0, column=1, sticky='nsew') root.mainloop()
内容的提问来源于stack exchange,提问作者BeanBagTheCat
相关产品推荐
相关产品推荐

