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
Libérer: 2024-12-17 15:26:10
original
742 Les gens l'ont consulté

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()
Copier après la connexion

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()
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal