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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With