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.
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="#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): '''Put in some fake data''' 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): '''Reset the scroll region to encompass the inner frame''' self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if nom == "__main__":
root=tk.Tk() example = Example(root) example.pack(side="top", fill="both", expand=True) root.mainloop()
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="%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):
'''Reset the scroll region to encompass the inner frame''' 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("
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!