ScrolledFrame
ttkbootstrap.scrolled.ScrolledFrame (Frame)
A widget container with a vertical scrollbar.
The ScrolledFrame fills the width of its container. The height is either set explicitly or is determined by the content frame's contents.
This widget behaves mostly like a normal frame other than the
exceptions stated already. Another exception is when packing it
into a Notebook or Panedwindow. In this case, you'll need to add
the container instead of the content frame. For example,
mynotebook.add(myscrolledframe.container)
.
The scrollbar has an autohide feature that can be turned on by
setting autohide=True
.
Examples:
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from ttkbootstrap.scrolled import ScrolledFrame
app = ttk.Window()
sf = ScrolledFrame(app, autohide=True)
sf.pack(fill=BOTH, expand=YES, padx=10, pady=10)
# add a large number of checkbuttons into the scrolled frame
for x in range(20):
ttk.Checkbutton(sf, text=f"Checkbutton {x}").pack(anchor=W)
app.mainloop()
__init__(self, master=None, padding=2, bootstyle='default', autohide=False, height=200, width=300, scrollheight=None, **kwargs)
special
Parameters:
Name | Type | Description | Default |
---|---|---|---|
master |
Widget |
The parent widget. |
None |
padding |
int |
The amount of empty space to create on the outside of the widget. |
2 |
bootstyle |
str |
A style keyword used to set the color and style of the vertical scrollbar. Available options include -> primary, secondary, success, info, warning, danger, dark, light. |
'default' |
autohide |
bool |
When True, the scrollbars will hide when the mouse is not within the frame bbox. |
False |
height |
int |
The height of the container frame in screen units. |
200 |
width |
int |
The width of the container frame in screen units. |
300 |
scrollheight |
int |
The height of the content frame in screen units. If None, the height is determined by the frame contents. |
None |
**kwargs |
Dict[str, Any] |
Other keyword arguments passed to the content frame. |
{} |
Source code in ttkbootstrap/scrolled.py
def __init__(
self,
master=None,
padding=2,
bootstyle=DEFAULT,
autohide=False,
height=200,
width=300,
scrollheight=None,
**kwargs,
):
"""
Parameters:
master (Widget):
The parent widget.
padding (int):
The amount of empty space to create on the outside of
the widget.
bootstyle (str):
A style keyword used to set the color and style of the
vertical scrollbar. Available options include -> primary,
secondary, success, info, warning, danger, dark, light.
autohide (bool):
When **True**, the scrollbars will hide when the mouse
is not within the frame bbox.
height (int):
The height of the container frame in screen units.
width (int):
The width of the container frame in screen units.
scrollheight (int):
The height of the content frame in screen units. If None,
the height is determined by the frame contents.
**kwargs (Dict[str, Any]):
Other keyword arguments passed to the content frame.
"""
# content frame container
self.container = ttk.Frame(
master=master,
relief=FLAT,
borderwidth=0,
width=width,
height=height,
)
self.container.bind("<Configure>", lambda _: self.yview())
self.container.propagate(0)
# content frame
super().__init__(
master=self.container,
padding=padding,
bootstyle=bootstyle.replace('round', ''),
**kwargs,
)
self.place(rely=0.0, relwidth=1.0, height=scrollheight)
# vertical scrollbar
self.vscroll = ttk.Scrollbar(
master=self.container,
command=self.yview,
orient=VERTICAL,
bootstyle=bootstyle,
)
self.vscroll.pack(side=RIGHT, fill=Y)
self.winsys = self.tk.call("tk", "windowingsystem")
# setup autohide scrollbar
self.autohide = autohide
if self.autohide:
self.hide_scrollbars()
# widget event binding
self.container.bind("<Enter>", self._on_enter, "+")
self.container.bind("<Leave>", self._on_leave, "+")
self.container.bind("<Map>", self._on_map, "+")
self.bind("<<MapChild>>", self._on_map_child, "+")
# delegate content geometry methods to container frame
_methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys()
for method in _methods:
if any(["pack" in method, "grid" in method, "place" in method]):
# prefix content frame methods with 'content_'
setattr(self, f"content_{method}", getattr(self, method))
# overwrite content frame methods from container frame
setattr(self, method, getattr(self.container, method))
autohide_scrollbar(self)
Toggle the autohide funtionality. Show the scrollbars when the mouse enters the widget frame, and hide when it leaves the frame.
Source code in ttkbootstrap/scrolled.py
def autohide_scrollbar(self):
"""Toggle the autohide funtionality. Show the scrollbars when
the mouse enters the widget frame, and hide when it leaves the
frame."""
self.autohide = not self.autohide
disable_scrolling(self)
Disable mousewheel scrolling on the frame and all of its children.
Source code in ttkbootstrap/scrolled.py
def disable_scrolling(self):
"""Disable mousewheel scrolling on the frame and all of its
children."""
children = self.winfo_children()
for widget in [self, *children]:
if self.winsys.lower() == "x11":
widget.unbind("<Button-4>")
widget.unbind("<Button-5>")
else:
widget.unbind("<MouseWheel>")
enable_scrolling(self)
Enable mousewheel scrolling on the frame and all of its children.
Source code in ttkbootstrap/scrolled.py
def enable_scrolling(self):
"""Enable mousewheel scrolling on the frame and all of its
children."""
children = self.winfo_children()
for widget in [self, *children]:
bindings = widget.bind()
if self.winsys.lower() == "x11":
if "<Button-4>" in bindings or "<Button-5>" in bindings:
continue
else:
widget.bind("<Button-4>", self._on_mousewheel, "+")
widget.bind("<Button-5>", self._on_mousewheel, "+")
else:
if "<MouseWheel>" not in bindings:
widget.bind("<MouseWheel>", self._on_mousewheel, "+")
hide_scrollbars(self)
Hide the scrollbars.
Source code in ttkbootstrap/scrolled.py
def hide_scrollbars(self):
"""Hide the scrollbars."""
self.vscroll.pack_forget()
show_scrollbars(self)
Show the scrollbars.
Source code in ttkbootstrap/scrolled.py
def show_scrollbars(self):
"""Show the scrollbars."""
self.vscroll.pack(side=RIGHT, fill=Y)
yview(self, *args)
Update the vertical position of the content frame within the container.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
*args |
List[Any, ...] |
Optional arguments passed to yview in order to move the content frame within the container frame. |
() |
Source code in ttkbootstrap/scrolled.py
def yview(self, *args):
"""Update the vertical position of the content frame within the
container.
Parameters:
*args (List[Any, ...]):
Optional arguments passed to yview in order to move the
content frame within the container frame.
"""
if not args:
first, _ = self.vscroll.get()
self.yview_moveto(fraction=first)
elif args[0] == "moveto":
self.yview_moveto(fraction=float(args[1]))
elif args[0] == "scroll":
self.yview_scroll(number=int(args[1]), what=args[2])
else:
return
yview_moveto(self, fraction)
Update the vertical position of the content frame within the container.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
fraction |
float |
The relative position of the content frame within the container. |
required |
Source code in ttkbootstrap/scrolled.py
def yview_moveto(self, fraction: float):
"""Update the vertical position of the content frame within the
container.
Parameters:
fraction (float):
The relative position of the content frame within the
container.
"""
base, thumb = self._measures()
if fraction < 0:
first = 0.0
elif (fraction + thumb) > 1:
first = 1 - thumb
else:
first = fraction
self.vscroll.set(first, first + thumb)
self.content_place(rely=-first * base)
yview_scroll(self, number, what)
Update the vertical position of the content frame within the container.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
number |
int |
The amount by which the content frame will be moved within the container frame by 'what' units. |
required |
what |
str |
The type of units by which the number is to be interpeted. This parameter is currently not used and is assumed to be 'units'. |
required |
Source code in ttkbootstrap/scrolled.py
def yview_scroll(self, number: int, what: str):
"""Update the vertical position of the content frame within the
container.
Parameters:
number (int):
The amount by which the content frame will be moved
within the container frame by 'what' units.
what (str):
The type of units by which the number is to be interpeted.
This parameter is currently not used and is assumed to be
'units'.
"""
first, _ = self.vscroll.get()
fraction = (number / 100) + first
self.yview_moveto(fraction)