The following image shows a Tkinter window with a scrollable frame , where the top part is frozen.

The code.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
from tkinter import * root=Tk() root.title("Top Part is Frozen") label = Label(root, text="User Information") label.grid(row=0, column=0, padx=10, pady=5, sticky="w") label = Label(root ,text = "User Balance") label.grid(row=1, column=0, padx=10, pady=5, sticky="w") frame = Frame(root) frame.grid(row=2, column=0, sticky="nsew") canvas = Canvas(frame) scrollbar = Scrollbar(frame, orient="vertical", command=canvas.yview) canvas.configure(yscrollcommand=scrollbar.set) content_frame=Frame(canvas) content_frame.bind("<Configure>", lambda e:canvas.configure(scrollregion=canvas.bbox("all"))) ######### Content Begins ################ label = Label(content_frame, text="Scrollable Content") label.grid(row=2, column=0, padx=10, pady=5) for i in range(3,21): button = Button(content_frame, text=f"Button {i}") button.grid(row=i, column=0, pady=5) ############ Content Ends ################### root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) canvas.create_window((0,0) ,window=content_frame, anchor="nw") canvas.grid(row=0, column=0, sticky="nsew") scrollbar.grid(row=0, column=1, sticky="ns") def _on_mousewheel(event): canvas.yview_scroll(int(-1*(event.delta/120)), "units") canvas.bind_all("<MouseWheel>", _on_mousewheel) root.mainloop() |