Maison >développement back-end >Tutoriel Python >Comment créer un cadre défilant dans Tkinter avec activation automatique ?

Comment créer un cadre défilant dans Tkinter avec activation automatique ?

DDD
DDDoriginal
2024-11-14 18:13:02223parcourir

How to Create a Scrollable Frame in Tkinter with Automatic Activation?

Barre de défilement Tkinter pour cadre

Problème :

Créer une barre de défilement verticale pour un cadre qui s'active automatiquement lorsque le contenu du cadre dépasse sa hauteur, permettant ainsi l'affichage de plusieurs étiquettes dans le cadre. frame.

Implémentation :

Voici un exemple de code qui encapsule un cadre déroulant :

# VerticalScrolledFrame class allows vertical scrolling within a frame
class VerticalScrolledFrame(ttk.Frame):
    def __init__(self, parent, *args, **kw):
        # Create a canvas and vertical scrollbar
        vscrollbar = ttk.Scrollbar(self, orient=VERTICAL)
        vscrollbar.pack(fill=Y, side=RIGHT, expand=FALSE)
        canvas = tk.Canvas(self, bd=0, highlightthickness=0,
                            yscrollcommand=vscrollbar.set)
        canvas.pack(side=LEFT, fill=BOTH, expand=TRUE)
        vscrollbar.config(command=canvas.yview)
        
        # Create an inner frame for content, scrollable within the canvas
        self.interior = interior = ttk.Frame(canvas)
        interior_id = canvas.create_window(0, 0, window=interior,
                                            anchor=NW)
        
        # Synchronize frame and canvas dimensions
        def _configure_interior(event):
            size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
            canvas.config(scrollregion="0 0 %s %s" % size)
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.config(width=interior.winfo_reqwidth())
        interior.bind('<Configure>', _configure_interior)
        
        def _configure_canvas(event):
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.itemconfigure(interior_id, width=canvas.winfo_width())
        canvas.bind('<Configure>', _configure_canvas)

Avantages de cette implémentation :

  • Il encapsule le canevas, la barre de défilement, et un cadre intérieur pour une gestion plus facile.
  • Il synchronise automatiquement les dimensions de la toile avec le contenu du cadre intérieur.
  • Il garantit une fonctionnalité de défilement cohérente et fiable.

Utilisation :

# Example usage
app = tk.Tk()
my_frame = VerticalScrolledFrame(app)
my_frame.pack()
for i in range(50):
    ttk.Label(my_frame.interior, text=i).grid(row=i, column=0)  # Grid method ensures proper layout of labels
app.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