Холст сгенерирует событие <Configure>
при изменении его размера.Когда это произойдет, вы можете привязать это событие и сбросить размер внутреннего фрейма, чтобы он соответствовал ширине холста.
Однако, в вашем конкретном случае у вас есть серия стековых виджетов, ни один из которыхбудет расти при изменении размера окна.Поэтому даже при изменении размера окна холст не увеличивается.Поскольку холст не растет, событие не будет запущено.
Вам нужно будет использовать соответствующие параметры для менеджеров геометрии, чтобы убедиться, что вся иерархия окон растет и сжимается соответствующим образом, а затем добавитьпривязка для установки размера внутреннего окна.
Вот очень простой пример.Он начинается с создания холста и упаковки его так, чтобы он заполнил корневое окно.Затем он добавляет рамку внутри холста и организует изменение ширины рамки при изменении размера холста.
import tkinter as tk
def handle_canvas_resize(event):
canvas.itemconfigure(window_id, width=event.width)
def handle_frame_resize(event):
canvas.configure(scrollregion=canvas.bbox("all"))
root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200)
scrollbar = tk.Scrollbar(root, command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.pack(side="right", fill="y")
canvas.pack(fill="both", expand=True)
inner_frame = tk.Frame(canvas, background="bisque")
window_id = canvas.create_window(2,2, window=inner_frame)
for i in range(1, 101):
label = tk.Label(inner_frame, text="label #{}".format(i))
label.pack(side="top", fill="x", padx=1, pady=1)
inner_frame.bind("<Configure>", handle_frame_resize)
canvas.bind("<Configure>", handle_canvas_resize)
root.after_idle(canvas.yview_moveto, 0)
root.mainloop()