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

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

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

Подскажите, в чем я не прав и помогите победить 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 шт):
Вот в качестве примера.
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()
