如何调整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
相关产品推荐
相关产品推荐

