Home > Backend Development > Python Tutorial > How to Add a Scrollbar to a Group of Widgets in Tkinter?

How to Add a Scrollbar to a Group of Widgets in Tkinter?

Barbara Streisand
Release: 2024-12-26 20:25:18
Original
922 people have browsed it

How to Add a Scrollbar to a Group of Widgets in Tkinter?

Adding a Scrollbar to a Group of Widgets in Tkinter

Overview

Tkinter's scrollbar functionality is limited to specific widgets, excluding Frame and root widgets. Overcoming this limitation requires alternative approaches.

Frame-Embedded-in-Canvas Approach

  • Create a canvas widget and associate scrollbars with it.
  • Embed a frame containing the label widgets within the canvas.
  • Set the canvas's scrollregion to match the frame's size.

Object-Oriented Solution

import tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):

        # Initialize frame
        tk.Frame.__init__(self, parent)

        # Create canvas and scrollbar
        self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
        self.frame = tk.Frame(self.canvas, background="#ffffff")
        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)

        # Pack widgets
        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)
        self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame")

        # Bind frame's <Configure> event to update scroll region
        self.frame.bind("<Configure>", self.onFrameConfigure)

        # Populate with data
        self.populate()

    def populate(self):
        for row in range(100):
            tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1",
                     relief="solid").grid(row=row, column=0)
            t = "this is the second column for row %s" %row
            tk.Label(self.frame, text=t).grid(row=row, column=1)

    def onFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

if __name__ == "__main__":
    root=tk.Tk()
    example = Example(root)
    example.pack(side="top", fill="both", expand=True)
    root.mainloop()
Copy after login

Procedural Solution

import tkinter as tk

def populate(frame):
    for row in range(100):
        tk.Label(frame, text="%s" % row, width=3, borderwidth="1", 
                 relief="solid").grid(row=row, column=0)
        t = "this is the second column for row %s" %row
        tk.Label(frame, text=t).grid(row=row, column=1)

def onFrameConfigure(canvas):
    canvas.configure(scrollregion=canvas.bbox("all"))

root = tk.Tk()
canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
frame = tk.Frame(canvas, background="#ffffff")
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4,4), window=frame, anchor="nw")

frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))

populate(frame)

root.mainloop()
Copy after login

The above is the detailed content of How to Add a Scrollbar to a Group of Widgets in Tkinter?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template