Maison > développement back-end > Tutoriel Python > Comment puis-je ajouter une barre de défilement à un groupe de widgets dans Tkinter, en particulier lorsqu'il s'agit d'un grand nombre d'étiquettes générées à partir des données d'un fichier journal ?

Comment puis-je ajouter une barre de défilement à un groupe de widgets dans Tkinter, en particulier lorsqu'il s'agit d'un grand nombre d'étiquettes générées à partir des données d'un fichier journal ?

DDD
Libérer: 2024-12-26 21:16:15
original
325 Les gens l'ont consulté

How can I add a scrollbar to a group of widgets in Tkinter, especially when dealing with a large number of labels generated from log file data?

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

Impossible d'incorporer une barre de défilement avec un affichage important d'étiquettes générées à partir du journal les données de fichiers posent un défi dans Tkinter. Ce problème est dû à la restriction des barres de défilement à des types de widgets spécifiques, à l'exclusion de ceux utilisés pour afficher une grille de widgets.

Plusieurs solutions existent pour surmonter cette limitation. Pour des affichages verticaux ou horizontaux plus simples, un widget de texte couplé à la méthode window_create présente une option viable. Cependant, cela pourrait ne pas suffire pour des mises en page plus complexes. Une méthode plus complète consiste à utiliser un widget de canevas avec des barres de défilement associées. Intégrez le cadre contenant les widgets d'étiquette dans ce canevas. En ajustant l'option scrollregion pour qu'elle corresponde aux dimensions du cadre, vous activez efficacement le défilement des widgets.

L'intégration de widgets dans un cadre plutôt que directement dans le canevas est avantageuse car les barres de défilement du canevas ne peut manipuler que des éléments créés via des méthodes spécifiques. L'emballage, le placement ou le maillage d'éléments sur un canevas ne sont pas reconnus à des fins de défilement. Un cadre, cependant, autorise ces méthodes dans ses limites, et la création ultérieure d'une fenêtre entraîne l'inclusion du cadre.

Dessiner des éléments de texte directement sur le canevas est une autre option . Cette approche nécessite la détermination de la hauteur de ligne de la police, qui définit ensuite les coordonnées y de chaque élément de texte. Les coordonnées X restent fixes en fonction de l'élément le plus large de chaque colonne. Le marquage des éléments par colonne permet d'ajuster tous les éléments d'une colonne via une seule commande.

Solution orientée objet

Vous trouverez ci-dessous une implémentation orientée objet du frame-embedded-in-canvas solution :

import tkinter as tk</p>
<p>class Exemple(tk.Frame):</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">def __init__(self, parent):

    tk.Frame.__init__(self, parent)
    self.canvas = tk.Canvas(self, borderwidth=0, background=&quot;#ffffff&quot;)
    self.frame = tk.Frame(self.canvas, background=&quot;#ffffff&quot;)
    self.vsb = tk.Scrollbar(self, orient=&quot;vertical&quot;, command=self.canvas.yview)
    self.canvas.configure(yscrollcommand=self.vsb.set)

    self.vsb.pack(side=&quot;right&quot;, fill=&quot;y&quot;)
    self.canvas.pack(side=&quot;left&quot;, fill=&quot;both&quot;, expand=True)
    self.canvas.create_window((4,4), window=self.frame, anchor=&quot;nw&quot;,
                              tags=&quot;self.frame&quot;)

    self.frame.bind(&quot;<Configure>&quot;, self.onFrameConfigure)

    self.populate()

def populate(self):
    '''Put in some fake data'''
    for row in range(100):
        tk.Label(self.frame, text=&quot;%s&quot; % row, width=3, borderwidth=&quot;1&quot;,
                 relief=&quot;solid&quot;).grid(row=row, column=0)
        t=&quot;this is the second column for row %s&quot; %row
        tk.Label(self.frame, text=t).grid(row=row, column=1)

def onFrameConfigure(self, event):
    '''Reset the scroll region to encompass the inner frame'''
    self.canvas.configure(scrollregion=self.canvas.bbox(&quot;all&quot;))
Copier après la connexion

if nom == "__main__":

root=tk.Tk()
example = Example(root)
example.pack(side=&quot;top&quot;, fill=&quot;both&quot;, expand=True)
root.mainloop()
Copier après la connexion

Solution procédurale

Voici une solution alternative sans utiliser un class:

import tkinter as tk</p>
<p>def populate(frame):</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">'''Put in some fake data'''
for row in range(100):
    tk.Label(frame, text=&quot;%s&quot; % row, width=3, borderwidth=&quot;1&quot;, 
             relief=&quot;solid&quot;).grid(row=row, column=0)
    t=&quot;this is the second column for row %s&quot; %row
    tk.Label(frame, text=t).grid(row=row, column=1)
Copier après la connexion

def onFrameConfigure(canvas):

'''Reset the scroll region to encompass the inner frame'''
canvas.configure(scrollregion=canvas.bbox(&quot;all&quot;))
Copier après la connexion

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("", événement lambda, 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!

source:php.cn
Article précédent:Comment puis-je lire efficacement des fichiers binaires octet par octet en Python ? Article suivant:Comment puis-je sortir efficacement des boucles imbriquées en Python ?
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
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal