I work on tkinter with a scrollable frame class provided here : https://gist.github.com/mp035/9f2027c3ef9172264532fcd6262f3b01
The actual code for this class is :
class ScrollFrame(ttk.Frame):
def __init__(self, parent):
super().__init__(parent) # create a frame (self)
s=ttk.Style()
s.configure('TFrame', background="#eff0f1")
#place canvas on self
self.canvas = tk.Canvas(self, borderwidth=0, background="#eff0f1", height = appHeight)
#place a frame on the canvas, this frame will hold the child widgets
self.viewPort = ttk.Frame(self.canvas, style='TFrame')
#place a scrollbar on self
self.vsb = ttk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
#attach scrollbar action to scroll of canvas
self.canvas.configure(yscrollcommand=self.vsb.set)
#pack scrollbar to right of self
self.vsb.pack(side="right", fill="y")
#pack canvas to left of self and expand to fil
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas_window = self.canvas.create_window((4,4),
#add view port frame to canvas
window=self.viewPort, anchor="nw",
tags="self.viewPort")
#bind an event whenever the size of the viewPort frame changes.
self.viewPort.bind("<Configure>", self.onFrameConfigure)
#bind an event whenever the size of the viewPort frame changes.
self.canvas.bind("<Configure>", self.onCanvasConfigure)
#perform an initial stretch on render, otherwise the scroll region has a tiny border until the first resize
self.onFrameConfigure(None)
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
#whenever the size of the frame changes, alter the scroll region respectively.
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def onCanvasConfigure(self, event):
'''Reset the canvas window to encompass inner frame when required'''
canvas_width = event.width
#whenever the size of the canvas changes alter the window region respectively.
self.canvas.itemconfig(self.canvas_window, width = canvas_width)
It actually works pretty good except I can't make mousewheel works on the scrollbar... I have to click on the slider and make it slide. Whenever I try to scroll with the mousewheel, I got this error in the console:
Traceback (most recent call last):
File "D:\Anaconda\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "D:\Anaconda\lib\tkinter\__init__.py", line 1739, in yview
res = self.tk.call(self._w, 'yview', *args)
_tkinter.TclError: unknown option "": must be moveto or scroll
I've found this topic : tkinter: binding mousewheel to scrollbar
but none of the given answer to adapt my class seemed to work.
Does anyone knows how can I adapt my scrollable frame in order to make the mousewheel works ? Thanks in advance !!