Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich einer Gruppe von Widgets in Tkinter eine Bildlaufleiste hinzufügen?
Tkinter bietet ein Bildlaufleisten-Widget zum vertikalen oder horizontalen Scrollen eines Fensters. Die Scrollbar-Schnittstelle kann jedoch nur bestimmten Widgets zugeordnet werden, z. B. Liste, Textfeld, Leinwand und Eintrag. Mit der Methode window_create können einfache vertikale oder horizontale Gruppen von Widgets in einem Text-Widget platziert werden. Allerdings mangelt es dieser Methode an Flexibilität für komplexe Layouts.
Eine gängigere Lösung für ein allgemeines Layout ist die Verwendung eines Canvas-Widgets mit zugehörigen Bildlaufleisten. Die Widgets werden dann in den Rahmen eingebettet, der innerhalb der Leinwand platziert wird. Die Breite und Höhe des Rahmens sollten so eingestellt werden, dass sie mit dem Bildlaufbereich der Leinwand übereinstimmen.
Das Einbetten der Widgets in einen Rahmen ermöglicht die Platzierung mithilfe der Pack-, Platzierungs- oder Rastermethoden. Dieser Ansatz stellt sicher, dass alle innerhalb des Rahmens erstellten Elemente mithilfe der Bildlaufleiste gescrollt werden können.
Alternativ ist auch das Zeichnen von Textelementen direkt auf der Leinwand möglich. Die Zeilenhöhe und die Koordinaten können anhand der Schriftart- und Layoutanforderungen berechnet werden. Das Markieren von Elementen mit Spalteninformationen ermöglicht eine einfache Anpassung der X-Koordinaten und Breiten über Spalten hinweg.
Hier ist ein Beispiel für die in die Leinwand eingebettete Rahmenlösung unter Verwendung eines Objekts -orientierter Ansatz:
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()
Hier ist eine prozedurale Lösung, die nicht a verwendet Klasse:
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()
Zusammenfassend lässt sich sagen, dass die Scrollbar-Schnittstelle von Tkinter zwar Einschränkungen aufweist, es aber mehrere Ansätze zum Hinzufügen einer Scrollbar zu einer Gruppe von Widgets gibt. Wenn Sie diese Ansätze verstehen, können Sie die Anzeige und das Scrollen Ihres Tkinter-Fensters effektiv verwalten.
Das obige ist der detaillierte Inhalt vonWie kann ich einer Gruppe von Widgets in Tkinter eine Bildlaufleiste hinzufügen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!