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

如何调整Tkinter可滚动Canvas控件大小,使其随窗口缩放自动填充顶层窗口

解决方案

你遇到的问题由两处配置缺失导致,修改后即可实现窗口拉伸时控件同步填满的效果:

  • 所有使用grid布局的父容器都需要给对应行列配置weight权重,才会将窗口拉伸产生的额外空间分配给子控件
  • Canvas内部嵌入的子控件不会自动跟随Canvas尺寸变化,需要绑定Canvas的尺寸变化事件同步调整内部frame的大小

修改后的完整代码如下:

import tkinter as tk
from tkinter import ttk

class ScrollableFrame():
    def __init__(self, container, *args, **kwargs):
        self.container = container
        # 给当前容器的行0、列0设置权重,让Canvas可以填满容器
        self.container.grid_rowconfigure(0, weight=1)
        self.container.grid_columnconfigure(0, weight=1)
        
        self.canvas = tk.Canvas(self.container, bg="green")
        self.scrollbar = ttk.Scrollbar(self.container, orient="horizontal", command=self.canvas.xview)
        self.scrollable_frame = tk.Frame(self.canvas)
        
        # 给scrollable_frame的行0、列0、列1设置权重,让内部的两个Text控件可以拉伸
        self.scrollable_frame.grid_rowconfigure(0, weight=1)
        self.scrollable_frame.grid_columnconfigure(0, weight=1)
        self.scrollable_frame.grid_columnconfigure(1, weight=1)
        
        self.scrollable_frame.bind("<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))

        self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
        self.canvas.configure(xscrollcommand=self.scrollbar.set)
        
        # 绑定Canvas尺寸变化事件,同步调整内部frame的宽度
        self.canvas.bind("<Configure>", lambda e: self.canvas.itemconfig("all", width=e.width))
        
        self.canvas.grid(row=0, column=0, sticky="wesn")
        self.scrollbar.grid(row=1, column=0, sticky="wesn")
        
if __name__ == "__main__":
    root = tk.Tk()
    root.configure(bg="grey20")
    # 给根窗口的行0、列0设置权重,让滚动框架可以填满根窗口
    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    
    s = ScrollableFrame(root)
    
    t = tk.Text(s.scrollable_frame)
    t.grid(row=0, column=0, sticky="wesn")
    
    t2 = tk.Text(s.scrollable_frame)
    t2.grid(row=0, column=1, sticky="wesn")

    root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 05:54:01