Source code for ttkwidgets.frames.scrolledframe
"""
Author: RedFantom
License: GNU GPLv3
Source: This repository
"""
# The following sites were used for reference in the creation of this file:
# http://code.activestate.com/recipes/578894-mousewheel-binding-to-scrolling-area-tkinter-multi/
# http://tkinter.unpythonic.net/wiki/VerticalScrolledFrame
try:
import Tkinter as tk
import ttk
except ImportError:
import tkinter as tk
from tkinter import ttk
from ttkwidgets import AutoHideScrollbar
[docs]class ScrolledFrame(ttk.Frame):
"""
A frame that sports a vertically oriented scrollbar for scrolling.
:ivar interior: :class:`ttk.Frame` in which to put the widgets to be scrolled with any geometry manager.
"""
[docs] def __init__(self, master=None, compound=tk.RIGHT, canvasheight=400,
canvaswidth=400, canvasborder=0, autohidescrollbar=True, **kwargs):
"""
Create a ScrolledFrame.
:param master: master widget
:type master: widget
:param compound: "right" or "left": side the scrollbar should be on
:type compound: str
:param canvasheight: height of the internal canvas
:type canvasheight: int
:param canvaswidth: width of the internal canvas
:type canvaswidth: int
:param canvasborder: border width of the internal canvas
:type canvasborder: int
:param autohidescrollbar: whether to use an :class:`~ttkwidgets.AutoHideScrollbar` or a :class:`ttk.Scrollbar`
:type autohidescrollbar: bool
:param kwargs: keyword arguments passed on to the :class:`ttk.Frame` initializer
"""
ttk.Frame.__init__(self, master, **kwargs)
self.rowconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
if autohidescrollbar:
self._scrollbar = AutoHideScrollbar(self, orient=tk.VERTICAL)
else:
self._scrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL)
self._canvas = tk.Canvas(self, borderwidth=canvasborder, highlightthickness=0,
yscrollcommand=self._scrollbar.set, width=canvaswidth, height=canvasheight)
self.__compound = compound
self._scrollbar.config(command=self._canvas.yview)
self._canvas.yview_moveto(0)
self.interior = ttk.Frame(self._canvas)
self._interior_id = self._canvas.create_window(0, 0, window=self.interior, anchor=tk.NW)
self.interior.bind("<Configure>", self.__configure_interior)
self._canvas.bind("<Configure>", self.__configure_canvas)
self.__grid_widgets()
def __grid_widgets(self):
"""Places all the child widgets in the appropriate positions."""
scrollbar_column = 0 if self.__compound is tk.LEFT else 2
self._canvas.grid(row=0, column=1, sticky="nswe")
self._scrollbar.grid(row=0, column=scrollbar_column, sticky="ns")
def __configure_interior(self, *args):
"""
Private function to configure the interior Frame.
:param args: Tkinter event
"""
# Resize the canvas scrollregion to fit the entire frame
(size_x, size_y) = (self.interior.winfo_reqwidth(), self.interior.winfo_reqheight())
self._canvas.config(scrollregion="0 0 {0} {1}".format(size_x, size_y))
if self.interior.winfo_reqwidth() is not self._canvas.winfo_width():
# If the interior Frame is wider than the canvas, automatically resize the canvas to fit the frame
self._canvas.config(width=self.interior.winfo_reqwidth())
def __configure_canvas(self, *args):
"""
Private function to configure the internal Canvas.
Changes the width of the canvas to fit the interior Frame
:param args: Tkinter event
"""
if self.interior.winfo_reqwidth() is not self._canvas.winfo_width():
self._canvas.configure(width=self.interior.winfo_reqwidth())
def __mouse_wheel(self, event):
"""
Private function to scroll the canvas view.
:param event: Tkinter event
"""
self._canvas.yview_scroll(-1 * (event.delta // 100), "units")
[docs] def resize_canvas(self, height=400, width=400):
"""
Function for the user to resize the internal Canvas widget if desired.
:param height: new height in pixels
:type height: int
:param width: new width in pixels
:type width: int
"""
self._canvas.configure(width=width, height=height)