Building a scrollbar in a frame using place method

python, tkinter

Solution

The code in the question is quite long and cannot be executed as is, so I am just giving a small example of how to scroll a frame by embedding it in a canvas.

In order for the scrollbar to scroll properly the frame, you need to update the `scrollregion` attribute of the canvas each time the size of the frame changes.

import tkinter as tk

def on_configure(event):
    canvas.configure(scrollregion=canvas.bbox('all'))

root = tk.Tk()

canvas = tk.Canvas(root)
canvas.place(relx=0, rely=0, relheight=1, relwidth=1)

frame = tk.Frame(canvas)
# resize the canvas scrollregion each time the size of the frame changes
frame.bind('<Configure>', on_configure)
# display frame inside the canvas
canvas.create_window(0, 0, window=frame)

scrolly = tk.Scrollbar(root, command=canvas.yview)
scrolly.place(relx=1, rely=0, relheight=1, anchor='ne')
canvas.configure(yscrollcommand=scrolly.set)

# populate the frame
for i in range(20):
    tk.Label(frame, text='Label %i' % i).pack()

root.mainloop()

Let me know if you have troubles adapting this example to your code.

Problem

Sorry for the jumbled mess of code I am getting a bit flustered with trying to solve this sidebar. I am attempting to build a sidebar in a frame using Tkinter and the sidebar appears and the entries are populated into the window although the scrollbar does not build and does not scroll down the frame. I am struggling at figuring out how to make it work and would really appreciate some assistance. ``` self.x = 50 self.y = 10 if not self.first_search_run: self.main_frame_content.destroy() self.main_frame_content_scrollbar.destroy() self.main_frame_content_canvas.destroy() self.main_frame_content_handler.destroy() self.main_frame_content = Frame(main) self.main_frame_content.place(relx=256/1280, rely=72/720, relwidth=1024/1280, relheight=648/720) self.main_frame_content_canvas = Canvas(self.main_frame_content) self.main_frame_content_handler = Frame(self.main_frame_content_canvas) self.main_frame_content.configure(background=mal_white) self.main_frame_content_canvas.bind("<Configure>", scroll_handler) self.main_frame_content_scrollbar = Scrollbar(self.main_frame_content_canvas, orient="vertical", command=self.main_frame_content_canvas) self.main_frame_content_canvas.configure(yscrollcommand = self.main_frame_content_scrollbar.set) self.main_frame_content_scrollbar.pack(side="right",fill="y") self.main_frame_content_canvas.place(relx=0, rely=0, relwidth=1, relheight=1) self.main_frame_content_canvas.configure(background=mal_white) self.main_frame_content_handler.configure(background=mal_white) self.main_frame_content_handler.place(relx=0, rely=0, relwidth=1, relheight=1, anchor=NW) if self.first_search_run: self.object_list = [] self.entry_list = [] self.image_list = [] self.entry_builder = 0 self.entry_builder_support = 0 self.first_search_run = False else: for entry in self.entry_list: entry.destroy() self.object_list = [] self.entry_list = [] self.image_list = [] self.entry_builder = 0 self.entry_builder_support = 0 for entry in self.search_response: try: image_load = urllib.request.urlopen(entry[11].text) except AttributeError: image_load = urllib.urlopen(entry[11].text) image_load = image_load.read() image_load = BytesIO(image_load) self.image = PIL.Image.open(image_load) self.image = self.image.resize((144, 203), PIL.Image.ANTIALIAS) self.entry_image = ImageTk.PhotoImage(self.image) self.main_content_entry = Canvas(self.main_frame_content_handler) self.main_content_entry.place(relx=self.x/1024, rely=self.y/648, relwidth=144/1024, relheight=203/648) self.main_content_entry_tooltip = Tooltip(self.main_content_entry, entry) self.object_list.append(entry) self.entry_list.append(self.main_content_entry) self.image_list.append(self.entry_image) self.x += 154 self.entry_builder += 1 self.entry_builder_support += 1 if self.entry_builder_support == 6: self.y += 213 self.x = 50 self.entry_builder_support = 0 self.entry_builder = 0 for image in self.image_list: self.entry_list[self.entry_builder].create_image(72, 203/2, image = image) self.entry_builder += 1 ```

Original source