Я пытаюсь заставить кадр и холст tkinter перестать расширяться до бесконечности и быть прокручиваемым. Они оба выходят за пределы длины корневого виджета, хотя я вручную установил оба их значения высоты намного меньше, чем размер экрана. Блок полосы прокрутки всегда занимает всю область полосы прокрутки, что делает его бесполезным. Можете ли вы сказать, что я делаю здесь не так?
Я прочитал довольно много документации, несколько учебных пособий, пытался редактировать и переупорядочивать строки в каждом разумном порядке, о котором я только мог думать, и пытался применять решения в дюжине других вопросов о переполнении стека, но ничего не изменилось. У меня все та же проблема, что и при первом неправильном кодировании виджета полосы прокрутки.
Вот минимальный воспроизводимый пример:
import tkinter as tk
global rownum
rownum = 1
def sub_frame(root, f):
global rownum
f2 = tk.Frame(f)
f2.grid(row=rownum+1, sticky='nw')
tk.Label(f2, text='sub-frame'+str(rownum)).grid()
print('Label', rownum, 'created')
rownum += 1
root.update()
root = tk.Tk()
root_width = str(int(root.winfo_screenwidth()))
root_height = str(int(root.winfo_screenheight()))
root.geometry(root_width + 'x' + root_height)
c = tk.Canvas(root, height=500)
f = tk.Frame(c, height=500)
b = tk.Button(f, command=(lambda x=sub_frame: x(root, f)), text='subframe')
c.create_window(0, 0, window=f, anchor='nw')
s = tk.Scrollbar(c, orient='vertical', command=c.yview)
c.grid(row=1, column=1)
f.grid(row=1, column=1)
b.grid(row=1)
s.grid(row=1, column=2, sticky='ns')
root.update()
c.config(scrollregion=c.bbox('all'), yscrollcommand=s.set)
root.mainloop()
Сообщения об ошибках не появляются. Я хочу, чтобы холст перестал расширяться от нижней части экрана и чтобы полоса прокрутки была полезной, а не просто расширялась прямо вместе с холстом.