Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Building a scrollbar in a frame using place method

Tags:

python

tkinter

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
like image 258
Richard Avatar asked Mar 04 '26 18:03

Richard


1 Answers

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.

like image 180
j_4321 Avatar answered Mar 06 '26 06:03

j_4321



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!