Maison >développement back-end >Tutoriel Python >Comment ajouter une barre de défilement à une grille d'étiquettes Tkinter ?

Comment ajouter une barre de défilement à une grille d'étiquettes Tkinter ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-17 15:26:10790parcourir

How to Add a Scrollbar to a Grid of Tkinter Labels?

Ajout d'une barre de défilement à un groupe de widgets dans Tkinter

Overview

Tkinter fournit des barres de défilement pour les widgets comme List , Zone de texte, Canevas et Entrée. Cependant, afficher une grille de widgets d'étiquettes avec une barre de défilement peut être difficile car ces widgets ne prennent pas en charge les barres de défilement de manière native.

Solutions

1. Widget de texte avec window_create :

  • Créez un widget de texte et ajoutez des widgets d'étiquette à l'aide de la méthode window_create.
  • Cette méthode est simple mais limite la complexité de la mise en page.

2. Toile avec cadre intégré :

  • Créez un widget de toile auquel sont attachées des barres de défilement.
  • Intégrez un cadre dans le canevas et placez vos widgets d'étiquette à l'intérieur du cadre.
  • Déterminez la largeur et la hauteur du cadre et définissez l'option scrollregion du canevas pour qu'elle corresponde à celles-ci. dimensions.

3. Dessin direct sur Canvas :

  • Créez une classe personnalisée qui hérite de tk.Frame pour gérer la barre de défilement et le canevas.
  • Placez vos widgets d'étiquette dans le cadre intégré.
  • Lier les événements pour ajuster la région de défilement en fonction de la configuration du cadre changements.

Solution orientée objet :

import tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        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)

        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")

        self.frame.bind("<Configure>", self.onFrameConfigure)

        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()

Solution procédurale :

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()

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn