Не работает Scrollbar
Программа должна по нажатию кнопки добавлять Label с текстом. Когда количество Label становится столько, что они не помещаются в окно, должен включаться скролл, но этого не происходит Я пробовала добавить pack_propagate(False), чтобы ограничить фрейм, но тогда в окне просто ничего не появлялось.
from tkinter import *
class Main:
def __init__(self, master):
self.number = 0
self.f = Frame(master)
self.f.pack()
self.c = Canvas(self.f, bg='white')
self.scroll = Scrollbar(self.f, command=self.c.yview)
self.c.config(yscrollcommand=self.scroll.set)
self.scroll.pack(fill=Y, side=RIGHT)
self.c.pack()
self.b = Button(self.c, text='Press', command=self.func)
self.b.pack()
def func(self):
self.number += 1
l = Label(self.c, text="Какой то текст {}".format(self.number))
l.pack()
root = Tk()
root.geometry('600x400')
main = Main(root)
root.mainloop()
Ответы (1 шт):
Нужно внутри canvas создать область ("окно"), в которой уже размещать элементы управления. При изменении виджета (фрейма), привязанного к этой области задавать свойство scrollregion (область прокрутки) холста, тогда полоса прокрутки будет менять свое состояние при добавлении элементов:
from tkinter import *
class Main:
def __init__(self, master):
self.number = 0
self.frame = Frame(master)
self.frame.pack(fill=BOTH, expand=1)
self.canvas = Canvas(self.frame, bg='white')
self.scroll = Scrollbar(self.frame, command=self.canvas.yview)
self.canvas.config(yscrollcommand=self.scroll.set)
self.scroll.pack(fill=Y, side=RIGHT)
self.canvas.pack(fill=BOTH, expand=1)
self.inner_frame = Frame(self.canvas)
self.canvas.create_window((0, 0), window=self.inner_frame, anchor=NW)
button = Button(self.inner_frame, text='Press', command=self.func)
button.pack()
def conf(event):
# Обработчик срабатывает при изменении размера inner_frame
# Задаем область прокрутки, включающую в себя все объекты на холсте
self.canvas.configure(scrollregion=self.canvas.bbox('all'))
self.inner_frame.bind('<Configure>', conf)
def func(self):
self.number += 1
label = Label(self.inner_frame, text="Какой то текст {}".format(self.number))
label.pack()
root = Tk()
# root.geometry('600x400')
main = Main(root)
root.mainloop()
Примерное объяснение см. в этом ответе: Несколько фреймов в столбец и scrollbar к ним
Также добавил параметры для pack, так что холст расширяется на все окно, и вместе с полосой прокрутки адекватно себя ведет при изменении размеров окна, поэтому не обязательно жестко задавать размер окна.