Adding a scrollbar to a group of widgets in Tkinter

后端 未结 3 930
暖寄归人
暖寄归人 2020-11-21 04:43

I am using Python to parse entries from a log file, and display the entry contents using Tkinter and so far it\'s been excellent. The output is a grid of label widgets, but

3条回答
  •  南旧
    南旧 (楼主)
    2020-11-21 04:56

    Extends class tk.Frame to support a scrollable Frame
    This class is independent from the widgets to be scrolled and can be used to replace a standard tk.Frame.


    import tkinter as tk
    
    class ScrollbarFrame(tk.Frame):
        """
        Extends class tk.Frame to support a scrollable Frame 
        This class is independent from the widgets to be scrolled and 
        can be used to replace a standard tk.Frame
        """
        def __init__(self, parent, **kwargs):
            tk.Frame.__init__(self, parent, **kwargs)
    
            # The Scrollbar, layout to the right
            vsb = tk.Scrollbar(self, orient="vertical")
            vsb.pack(side="right", fill="y")
    
            # The Canvas which supports the Scrollbar Interface, layout to the left
            self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
            self.canvas.pack(side="left", fill="both", expand=True)
    
            # Bind the Scrollbar to the self.canvas Scrollbar Interface
            self.canvas.configure(yscrollcommand=vsb.set)
            vsb.configure(command=self.canvas.yview)
    
            # The Frame to be scrolled, layout into the canvas
            # All widgets to be scrolled have to use this Frame as parent
            self.scrolled_frame = tk.Frame(self.canvas, background=self.canvas.cget('bg'))
            self.canvas.create_window((4, 4), window=self.scrolled_frame, anchor="nw")
    
            # Configures the scrollregion of the Canvas dynamically
            self.scrolled_frame.bind("", self.on_configure)
    
        def on_configure(self, event):
            """Set the scroll region to encompass the scrolled frame"""
            self.canvas.configure(scrollregion=self.canvas.bbox("all"))
    
    

    Usage:

    class App(tk.Tk):
        def __init__(self):
            super().__init__()
    
            sbf = ScrollbarFrame(self)
            self.grid_rowconfigure(0, weight=1)
            self.grid_columnconfigure(0, weight=1)
            sbf.grid(row=0, column=0, sticky='nsew')
            # sbf.pack(side="top", fill="both", expand=True)
    
            # Some data, layout into the sbf.scrolled_frame
            frame = sbf.scrolled_frame
            for row in range(50):
                text = "%s" % row
                tk.Label(frame, text=text,
                         width=3, borderwidth="1", relief="solid") \
                    .grid(row=row, column=0)
    
                text = "this is the second column for row %s" % row
                tk.Label(frame, text=text,
                         background=sbf.scrolled_frame.cget('bg')) \
                    .grid(row=row, column=1)
    
    
    if __name__ == "__main__":
        App().mainloop()
    

提交回复
热议问题