Как использовать scrollbar в Tkinter Python 3 для вывода списка из БД?

Пытаюсь установить scrollbar на базе Tkinter (Python 3) в GUI своей программы (самодельная бд), пока что не получается победить. Выводится рамка scrollbar-а без бегунка, но даже рамка выводится не на высоту отображаемого окна, а на всю высоту выведенного списка, часть которого скрыта из-за разрешения окна. Прикрепляю скриншот.

Скрин1

Графический интерфейс должен выводить список из БД, можно отметить галочками строки, по нажатию на пелпк исправить или подтвердить строки меняют статус, идея очень простая.

Начитавшись форумов пришел к выводу что нужно использовать frame_main для всего окна, в нем будут установлены grid-ом frame_canvas и кнопки, а уже в frame_canvas pack будут установлены canvas для вывода списка из БД и scrollbar.

Прикрепляю мою схему моей логики:

Схема

Но по итогу отображается лишь рамка без бегунка, а также высота рамки отображена на всю высоту списка, и не ограничена высотой окна интерфейса.

Скрин2

Подскажите, в чем я не прав и помогите победить scrollbar.

Код функции:

def admintable();
import pickle
global flsp1, root4, kolivanov, kolpetrov;

 ...
root4=Tk()
root4.geometry(‘1100x900-0-0’)
root4.title(“Администратор”)

frame_main=Frame(root4)
frame_main.grid(row=0, column=0)

frame_canvas=Frame(frame_main)
frame_canvas.grid(row=0, column=0)

canvas=Canvas(frame_canvas)
canvas.pack(side=RIGHT)

scroll_canv=Scrollbar(frame_canvas, orient=VERTICAL)
scroll_canv.pack(side=LEFT, fill=“y”)
scroll_canv.config(command=canvas.yview)

 <вывод списка из бд в canvas> 

but_0=Button(frame_main, text=‘Подтвердить’, command=ispoladm)
but_1=Button(frame_main, text=‘Исправить’, command=ispolndm_ipsr)
but_0.grid(row=0, column=1, sticky=‘nw’)
but_1.grid(row=0, column=1)

fraim_main.config(width=1100, height=900)
fraim_canvas.config(width=1000, height=600)
canvas.config(width=1100, height=500, yscrollcommand=scroll_canv.set)

root4.mainloop()

Ответы (1 шт):

Автор решения: GrAnd

Вот в качестве примера.

import tkinter as tk

root4 = tk.Tk()
root4.geometry("800x600")

frame_main = tk.Frame(root4)
frame_main.pack(fill=tk.BOTH, expand=True)

frame_canvas = tk.Frame(frame_main)
frame_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

canvas = tk.Canvas(frame_canvas, width=300)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

scroll_canv = tk.Scrollbar(frame_canvas, orient=tk.VERTICAL)
scroll_canv.pack(side=tk.LEFT, fill=tk.Y)
scroll_canv.config(command=canvas.yview)
canvas.config(yscrollcommand=scroll_canv.set)

frame_buttons = tk.Frame(frame_main)
frame_buttons.pack(side=tk.LEFT, fill=tk.Y)

but_0 = tk.Button(frame_buttons, text="Подтвердить")
but_0.pack(fill=tk.X, padx=15, pady=(15, 5))
but_1 = tk.Button(frame_buttons, text="Исправить")
but_1.pack(fill=tk.X, padx=15, pady=5)

# <вывод списка из бд в canvas> 
for i in range(100):
    canvas.create_text((5, i*18), text=f"Text {i+1} "*(i*87%13+2), fill="#"+f"{i*7%128:0>2x}{i*27%111:0>2x}{i*41%113:0>2x}", anchor="nw")

# !!! следующие 2 строки очень важны для корректного отображения скроллбара !!!
canvas.update_idletasks() 
canvas.configure(scrollregion=canvas.bbox("all"))

root4.mainloop()

-

→ Ссылка