Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich einer Gruppe von Widgets in Tkinter eine Bildlaufleiste hinzufügen, insbesondere wenn ich mit einer großen Anzahl von Labels arbeite, die aus Protokolldateidaten generiert werden?

Wie kann ich einer Gruppe von Widgets in Tkinter eine Bildlaufleiste hinzufügen, insbesondere wenn ich mit einer großen Anzahl von Labels arbeite, die aus Protokolldateidaten generiert werden?

DDD
DDDOriginal
2024-12-26 21:16:15316Durchsuche

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?

Hinzufügen einer Bildlaufleiste zu einer Gruppe von Widgets in Tkinter

Es kann keine Bildlaufleiste mit einer großen Anzeige von aus dem Protokoll generierten Beschriftungen integriert werden Dateidaten stellen in Tkinter eine Herausforderung dar. Dieses Problem entsteht durch die Beschränkung von Bildlaufleisten auf bestimmte Widget-Typen, mit Ausnahme derjenigen, die zum Anzeigen eines Widget-Rasters verwendet werden.

Es gibt mehrere Lösungen, um diese Einschränkung zu überwinden. Für einfachere vertikale oder horizontale Anzeigen stellt ein Text-Widget in Verbindung mit der Methode window_create eine praktikable Option dar. Für komplexere Layouts reicht dies jedoch möglicherweise nicht aus. Eine umfassendere Methode besteht darin, ein Canvas-Widget mit zugehörigen Bildlaufleisten zu verwenden. Betten Sie den Rahmen mit den Beschriftungs-Widgets in diese Leinwand ein. Indem Sie die Scrollregion-Option an die Rahmenabmessungen anpassen, ermöglichen Sie effektiv das Scrollen der Widgets.

Das Einbinden von Widgets in einen Rahmen statt direkt in die Leinwand ist aufgrund der Leinwand-Bildlaufleisten von Vorteil kann nur Elemente manipulieren, die mit bestimmten Methoden erstellt wurden. Das Packen, Platzieren oder Rastern von Elementen auf einer Leinwand wird zum Scrollen nicht erkannt. Ein Rahmen lässt diese Methoden jedoch innerhalb seiner Grenzen zu, und die anschließende Fenstererstellung führt zur Einbeziehung des Rahmens.

Eine weitere Option ist das direkte Zeichnen von Textelementen auf die Leinwand . Dieser Ansatz erfordert die Bestimmung der Zeilenhöhe der Schriftart, die anschließend die Y-Koordinaten für jedes Textelement definiert. Die X-Koordinaten bleiben basierend auf dem breitesten Element in jeder Spalte festgelegt. Das Markieren von Elementen nach Spalten ermöglicht Anpassungen an allen Elementen innerhalb einer Spalte mit einem einzigen Befehl.

Objektorientierte Lösung

Nachfolgend finden Sie eine objektorientierte Implementierung des in die Leinwand eingebetteten Rahmens Lösung:

import tkinter as tk</p>
<p>class Beispiel(tk.Frame):</p>
<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;))

if name == "__main__":

root=tk.Tk()
example = Example(root)
example.pack(side=&quot;top&quot;, fill=&quot;both&quot;, expand=True)
root.mainloop()

Prozedurale Lösung

Hier ist eine alternative Lösung ohne Verwendung A Klasse:

import tkinter as tk</p>
<p>def populate(frame):</p>
<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)

def onFrameConfigure(canvas):

'''Reset the scroll region to encompass the inner frame'''
canvas.configure(scrollregion=canvas.bbox(&quot;all&quot;))

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("", Lambda-Ereignis, canvas=canvas: onFrameConfigure(canvas))

populate(frame)

root.mainloop()

Das obige ist der detaillierte Inhalt vonWie kann ich einer Gruppe von Widgets in Tkinter eine Bildlaufleiste hinzufügen, insbesondere wenn ich mit einer großen Anzahl von Labels arbeite, die aus Protokolldateidaten generiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn