Как реализовать ScrollBar для Frame?
Вот кусок кода:
canvas = tkinter.Canvas(borderwidth=0, background="#ffffff")
frame= tkinter.Frame(canvas, background="#ffffff")
vsb = tkinter.Scrollbar(orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4, 4), window=frame, anchor="nw")
далее в frame циклом добавляю канва-объекты, они уходят за пределы экрана, но скролл так и остается неактивным. Что я делаю не так?
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Чтобы "активировать" scrollbar надо канве указать сколлируемый регион.
Если не требуется сложных вычислений, то проще всего это сделать двумя командами после размещения/изменения элементов канвы:
canvas.update_idletasks() # чтобы дать возможность установиться всем размерам
canvas.configure(scrollregion=canvas.bbox("all"))
Полный код для примера:
import tkinter
root = tkinter.Tk()
canvas = tkinter.Canvas(root, borderwidth=0, background="#ffffff")
frame= tkinter.Frame(canvas, background="#ffffff")
vsb = tkinter.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4, 4), window=frame, anchor="nw")
for i in range(20):
lbl = tkinter.Label(frame, text=f"Label {i}")
lbl.pack(side="top")
canvas.update_idletasks()
canvas.configure(scrollregion=canvas.bbox("all"))
root.mainloop()
