I have this scroll-able frame (frame inside canvas actually).
import Tkinter as tk
def __init__(self, parent,xsize,ysize,xcod,ycod):
Perhaps the simplest solution is to make a global binding for the mousewheel. It will then fire no matter what widget is under the mouse or which widget has the keyboard focus. You can then unconditionally scroll the canvas, or you can be smart and figure out which of your windows should scroll.
For example, on windows you would do something like this:
self.canvas = Canvas(...) self.canvas.bind_all("<MouseWheel>", self._on_mousewheel) ... def _on_mousewheel(self, event): self.canvas.yview_scroll(-1*(event.delta/120), "units")
self.canvas.bind_all is a bit misleading -- you more correctly should call
root.bind_all but I don't know what or how you define your root window. Regardless, the two calls are synonymous.
<MouseWheel>and you need to divide
event.deltaby 120 (or some other factor depending on how fast you want the scroll)
<MouseWheel>and you need to use
<Button-5>, and you need to divide
event.deltaby 120 (or some other factor depending on how fast you want to scroll)
There are more refined solutions involving virtual events and determining which window has the focus or is under the mouse, or passing the canvas window reference through the binding, but hopefully this will get you started.