tkinter scrollbar doesn't work in a window tkinter scrollbar doesn't work in a window tkinter tkinter

tkinter scrollbar doesn't work in a window


You're binding the Scrollbar to a Listbox which you aren't packing. That doesn't make sense.
You want to bind the Scrollbar to the text, which you have made a Label widget. However, you can't bind it to a Label widget (easily). You can, however, bind the Scrollbar to a Text widget.

If you make the Label a Text, you can not use the textvariable attribute. Instead of setting the textvariable in your button callback you must delete the contents of the Text and place new contents in it.

This is the modified code:

from tkinter import *class Search(Tk):    def __init__(self):        Tk.__init__(self)        self.minsize(380,444)        self.maxsize(380,444)        self.title("")        self.search_start = StringVar()        self.search_start.set('Enter your query')        self.search_result = StringVar()        self.bind("<Return>", self.search_button)        self.scrollbar_frame = Frame(self)        self.scrollbar_frame.pack(side=RIGHT, fill=Y)        self.search_bar = Frame(self, bg="blue")        self.search_bar.pack(side=TOP, fill=X)        self.index = Frame(self)        self.index.pack(side=LEFT)        self.content = Frame(self)        self.content.pack(side=TOP, fill=X)        self.status_bar = Frame(self, bg="yellow")        self.status_bar.pack(side=BOTTOM, fill=X)# ******* Search Input *******        self.entry = Entry(self.search_bar, textvariable = self.search_start)        self.entry.pack(side=LEFT, padx=4, pady=4)# ******* Search Button *******        self.search = Button(self.search_bar, text="Search", command=self.search_button)        self.search.pack(side=LEFT)# ******* Content *******        self.content = Text(self.content, bg="ghost white", width=52, height=26) # justify == align        self.content.pack(side=LEFT)# ******* Scrollbar *******        self.scrollbar = Scrollbar(self.scrollbar_frame)        self.scrollbar.pack(side=RIGHT, fill=Y)        self.content.config(yscrollcommand=self.scrollbar.set)        self.scrollbar.config(command=self.content.yview)# ******* Toolbar *******        self.status_bar = Label(self.status_bar, text="toolbar", bg="yellow", relief=FLAT)        self.status_bar.pack(side=LEFT)# ******* Search Button *******    def search_button(self, event=None):        result_text = dictionary_data.get(self.entry.get(), "Entry not in database.\n\nCheck if you wrote your query correctly or type index to see all available entries.")        self.content.delete(1.0, END)        self.content.insert(END, result_text)        self.search_start.set("")# ******* Dictionary data *******dictionary_data = {    "index": 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin laoreet a enim a elementum. Ut tristique maximus mauris vitae tempus. Aliquam erat volutpat. Etiam semper, libero posuere vulputate aliquet, arcu odio fermentum ex, vulputate elementum urna felis fringilla nisi. Quisque nec nunc eu lacus fermentum sollicitudin quis ut ante. Maecenas consectetur varius eros, quis mollis est tincidunt eget. Morbi tempus aliquam dui, quis placerat metus porta sit amet. Suspendisse vitae diam at nibh semper iaculis quis quis velit. Morbi ac ipsum porttitor, lacinia eros at, volutpat arcu. Vestibulum ut diam convallis, auctor metus a, malesuada ante. Aliquam vitae leo magna. Quisque rutrum tristique neque, ut venenatis nibh viverra eget. Duis vitae felis non lacus viverra varius. Nunc placerat eros sed arcu vestibulum, id pharetra felis fermentum. Quisque semper vitae dolor sed molestie. Suspendisse semper ante eu sem ultricies ullamcorper. Quisque suscipit pellentesque varius. Integer magna lorem, lacinia in dolor quis, commodo tempus nibh. Etiam fermentum cursus vehicula. Vestibulum congue arcu at purus viverra faucibus. Pellentesque pellentesque facilisis massa, vel iaculis mauris egestas eu. Sed ut risus eu turpis sodales faucibus. Morbi aliquam sit amet purus ac rhoncus. Aliquam eros orci, laoreet ut fringilla vitae, sodales vitae ipsum. Nunc eu enim condimentum, fermentum massa hendrerit, cursus orci. Suspendisse potenti. Nulla faucibus velit ipsum, sollicitudin elementum nibh consequat ac. Nunc et condimentum nibh. Sed a malesuada nisl.Nulla at est arcu. Maecenas elementum ex nulla. Aliquam erat volutpat. Vivamus mattis iaculis nulla, eget tempus purus fermentum vel. Etiam auctor dolor eget eros scelerisque accumsan. Donec lacus tellus, interdum non gravida quis, cursus non magna. Sed lacinia, elit quis hendrerit lobortis, lorem dolor viverra purus, interdum vestibulum enim orci ac nibh. Fusce tellus lacus, pharetra at dignissim eu, maximus at ipsum. Fusce nec semper felis.',}# ******* Loop *******app = Search()app.mainloop()


To connect scrollbars to a scrollable widget you need to do the following:

  1. Set the xscrollcommand and/or the yscrollcommand attributes of the widget to be scrolled (eg: a text widget, listbox or canvas). The value is typically the set method of a scrollbar.
  2. Set the command attribute of the scrollbar. The value is typically the xview or yview command of the widget to be scrolled.

For example:

text_widget = tk.Text(...)vertical_scrollbar = tk.Scrollbar(...)text_widget.configure(yscrollcommand=vertical_scrollbar.set)vertical_scrollbar.configure(command=text_widget.yview)

They must be hooked up in both directions so that the scrollbar reflects changes in the widget, and the widget reflects changes in the scrollbar.


This is a working example:

from tkinter import *# ******* Dictionary data *******dictionary_data = {    "index": 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin laoreet a enim a elementum. Ut tristique maximus mauris vitae tempus. Aliquam erat volutpat. Etiam semper, libero posuere vulputate aliquet, arcu odio fermentum ex, vulputate elementum urna felis fringilla nisi. Quisque nec nunc eu lacus fermentum sollicitudin quis ut ante. Maecenas consectetur varius eros, quis mollis est tincidunt eget. Morbi tempus aliquam dui, quis placerat metus porta sit amet. Suspendisse vitae diam at nibh semper iaculis quis quis velit. Morbi ac ipsum porttitor, lacinia eros at, volutpat arcu. Vestibulum ut diam convallis, auctor metus a, malesuada ante. Aliquam vitae leo magna. Quisque rutrum tristique neque, ut venenatis nibh viverra eget. Duis vitae felis non lacus viverra varius. Nunc placerat eros sed arcu vestibulum, id pharetra felis fermentum. Quisque semper vitae dolor sed molestie. Suspendisse semper ante eu sem ultricies ullamcorper. Quisque suscipit pellentesque varius. Integer magna lorem, lacinia in dolor quis, commodo tempus nibh. Etiam fermentum cursus vehicula. Vestibulum congue arcu at purus viverra faucibus. Pellentesque pellentesque facilisis massa, vel iaculis mauris egestas eu. Sed ut risus eu turpis sodales faucibus. Morbi aliquam sit amet purus ac rhoncus. Aliquam eros orci, laoreet ut fringilla vitae, sodales vitae ipsum. Nunc eu enim condimentum, fermentum massa hendrerit, cursus orci. Suspendisse potenti. Nulla faucibus velit ipsum, sollicitudin elementum nibh consequat ac. Nunc et condimentum nibh. Sed a malesuada nisl.Nulla at est arcu. Maecenas elementum ex nulla. Aliquam erat volutpat. Vivamus mattis iaculis nulla, eget tempus purus fermentum vel. Etiam auctor dolor eget eros scelerisque accumsan. Donec lacus tellus, interdum non gravida quis, cursus non magna. Sed lacinia, elit quis hendrerit lobortis, lorem dolor viverra purus, interdum vestibulum enim orci ac nibh. Fusce tellus lacus, pharetra at dignissim eu, maximus at ipsum. Fusce nec semper felis.',}# ******* Search Button *******def search_button(event=None):    content.delete("1.0", END)    result_text = dictionary_data.get(entry.get(), "Entry not in database.\n\nCheck if you wrote your query correctly or type index to see all available entries.")    search_result = result_text    search_start = ""    entry.delete(0, END)    content.insert(END, search_result)master = Tk()master.minsize(580,444)master.maxsize(580,444)master.title("Master")search_start = "Enter your query"search_result = ""master.bind("<Return>", search_button)# ******* Search Input *******entry = Entry(master)entry.insert(END, search_start)entry.pack(side=LEFT, padx=4, pady=4)# ******* Search Button *******search = Button(master, text="Search", command=search_button)search.pack(side=LEFT)# ******* Scroll & Content *******scrollbar = Scrollbar(master)scrollbar.pack(side=RIGHT, fill=Y)content = Text(master, yscrollcommand=scrollbar.set, bg="ghost white")content.insert(END, search_result)content.pack(side=LEFT)scrollbar.config(command=content.yview)# ******* Loop ***************mainloop()

Basically I used Text instead of Label.