![]() |
[Tkinter] Scrollbar, Frame and size of Frame - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: GUI (https://python-forum.io/forum-10.html) +--- Thread: [Tkinter] Scrollbar, Frame and size of Frame (/thread-21382.html) |
Scrollbar, Frame and size of Frame - Maksim - Sep-27-2019 Hello everybody. I use this script and it works good. But, i don't know how to do Frame(body) more bigger by vertically. Could somebody help me? ![]() ![]() ![]() import tkinter as tk from tkinter import ttk from tkinter import * class Scrollable(tk.Frame): """ Make a frame scrollable with scrollbar on the right. After adding or removing widgets to the scrollable frame, call the update() method to refresh the scrollable area. """ def __init__(self, frame, width=16): scrollbar = tk.Scrollbar(frame, width=width) scrollbar.pack(side=tk.RIGHT, fill=tk.Y)#, expand=False) self.canvas = tk.Canvas(frame, yscrollcommand=scrollbar.set) self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar.config(command=self.canvas.yview) self.canvas.bind('<Configure>', self.__fill_canvas) # base class initialization tk.Frame.__init__(self, frame) # assign this obj (the inner frame) to the windows item of the canvas self.windows_item = self.canvas.create_window(0,0, window=self, anchor=tk.NW) def __fill_canvas(self, event): "Enlarge the windows item to the canvas width" canvas_width = event.width self.canvas.itemconfig(self.windows_item, width = canvas_width) def update(self): "Update the canvas and the scrollregion" self.update_idletasks() self.canvas.config(scrollregion=self.canvas.bbox(self.windows_item)) root = tk.Tk() root.geometry('1000x700+100+50') root.resizable('False','False') header = Frame(root) body = Frame(root) footer = Frame(root) header.pack() body.pack(fill='x') footer.pack() header.configure(width=200, height=100) l1=Label(header, text="The header") l1.grid(column=0,row=0) ttk.Label(footer, text="The Footer").pack() scrollable_body = Scrollable(body, width=32) for i in range(30): ttk.Button(scrollable_body, text="I'm a button in the scrollable frame").grid(column=0,row=i) ttk.Button(scrollable_body, text="I'm").grid(column=1,row=i) scrollable_body.update() root.mainloop() RE: Scrollbar, Frame and size of Frame - Larz60+ - Sep-27-2019 first, since you are inheriting tk.Frame, I'd move the initialization of that as the first item in init, and don't pass frame to init, rather use: Note that I added defaults for width, height and title import tkinter as tk class GuiClass(tk.Tk): def __init__(self): tk.Tk.__init__(self) app=Application(self, width=1200, height=800, title="MySizedFrame") app.mainloop() class Application(tk.Frame): def __init__(self, parent, width=800, height=600, title="No Title"): tk.Frame.__init__(self, parent) # parent needs to be larger than frame, to accomidate scrollbar parent.geometry(f"{width+25}x{height+25}") self.configure(width=width) self.configure(height=height) parent.title(title) self.grid(sticky='nsew') self.add_widgets(self, width, height) def add_widgets(self, parent, width, height): scrollbar = tk.Scrollbar(parent) scrollbar.pack(side=tk.RIGHT, fill=tk.Y, expand=True) self.canvas = tk.Canvas(parent, bd=5, width=width, height=height, yscrollcommand=scrollbar.set) self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) if __name__ == '__main__': GuiClass()[attachment=716] RE: Scrollbar, Frame and size of Frame - Maksim - Sep-30-2019 Larz60+, thank you ![]() I used "tkscrolledframe" from tkscrolledframe import ScrolledFrameIt's easier, i think |