Прежде всего, единственный способ прокрутить что-либо на холсте - это поместить объект на холст с помощью одной из функций create_*
. Если вы добавляете рамку к холсту с grid
, она не может быть прокручена. Поэтому вам нужно удалить строку, которая вызывает grid
на new_frame
, и раскомментировать строку, которая вызывает create_window
.
Когда вы встраиваете рамку в холст с помощью create_window
, вы несете ответственность за поддержание размера виджета. В вашем случае вам нужно сбрасывать размер внутреннего фрейма всякий раз, когда сам холст меняет размер.
Поскольку у вас уже есть привязка к <Configure>
на холсте, все, что вам нужно сделать, это настроить размер внутреннего фрейма на основе параметра width
, переданного в объект события. Для этого вам нужно либо сохранить идентификатор созданного окна, либо присвоить созданному окну тег.
Давайте начнем с присвоения окну тега, который вы можете сделать при создании окна:
canvas.create_window((0, 0), window=new_frame, anchor='nw', tags=('internal_frame',))
Далее, сбросьте ширину этого фрейма, чтобы он соответствовал ширине вашего холста:
def on_configure(event):
canvas.itemconfigure('internal_frame', width=event.width-10)
...
Примечание: чтобы помочь визуализировать то, что происходит во время отладки, он помогает придавать характерные фоновые цвета холсту, внутренней рамке и окну. Это также помогает добавить отступы или границы, чтобы вы могли видеть, где заканчивается один виджет и начинается другой.