Heim >Backend-Entwicklung >Python-Tutorial >Wie füge ich eine Bildlaufleiste zu einem Raster von Tkinter-Labels hinzu?

Wie füge ich eine Bildlaufleiste zu einem Raster von Tkinter-Labels hinzu?

Susan Sarandon
Susan SarandonOriginal
2024-12-17 15:26:10739Durchsuche

How to Add a Scrollbar to a Grid of Tkinter Labels?

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

Übersicht

Tkinter bietet Bildlaufleisten für Widgets wie List , Textfeld, Leinwand und Eintrag. Allerdings kann die Anzeige eines Rasters von Beschriftungs-Widgets mit einer Bildlaufleiste eine Herausforderung sein, da diese Widgets keine Bildlaufleisten nativ unterstützen.

Solutions

1. Text-Widget mit window_create:

  • Erstellen Sie ein Text-Widget und fügen Sie Beschriftungs-Widgets mit der Methode window_create hinzu.
  • Diese Methode ist einfach, begrenzt jedoch die Komplexität des Layouts.

2. Leinwand mit eingebettetem Rahmen:

  • Erstellen Sie ein Leinwand-Widget mit angehängten Bildlaufleisten.
  • Betten Sie einen Rahmen in die Leinwand ein und platzieren Sie Ihre Beschriftungs-Widgets innerhalb des Rahmens.
  • Bestimmen Sie die Breite und Höhe des Rahmens und stellen Sie die Scrollregion-Option der Leinwand entsprechend ein Abmessungen.

3. Direktes Zeichnen auf der Leinwand:

  • Erstellen Sie eine benutzerdefinierte Klasse, die von tk.Frame erbt, um die Bildlaufleiste und die Leinwand zu verwalten.
  • Platzieren Sie Ihre Beschriftungs-Widgets im eingebetteten Rahmen.
  • Binden Sie Ereignisse, um den Bildlaufbereich basierend auf der Konfiguration des Frames anzupassen Änderungen.

Objektorientierte Lösung:

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()

Prozedurale Lösung:

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()

Das obige ist der detaillierte Inhalt vonWie füge ich eine Bildlaufleiste zu einem Raster von Tkinter-Labels hinzu?. 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