In tkinter, how to make custom child widget receive mouse scroll event?
===

I can't sort out how to make a custom widget receive mouse scroll events. If I bind to the root window, then notifications occur. And if I bind to a child of root window other than my widget (here a simple Listbox), the notifications also occur (evidenced by watching the list move when I move the wheel). What am I overlooking?

Example code where roll() never gets called:

    #!/usr/bin/python3
    from tkinter import *
    from tkinter.ttk import *
    
    class CustomWidget(Frame):
        def __init__(self, parent):
            Frame.__init__(self, parent)
            self.width = 200
            self.height = 200
            self.canvas = Canvas(self, width=200, height=200)
            self.canvas.config(background='red')
            self.canvas.pack()
    
            self.bind('<MouseWheel>', self.roll)
            self.bind('<Button-4>', self.roll)
            self.bind('<Button-5>', self.roll)
    
        def roll(self, event):
            print("detected mouse roll!");
    
    if __name__ == "__main__":
        root = Tk()
        root.wm_title("TestRoot")
      
        sb = Scrollbar(root, orient=VERTICAL)
        lb = Listbox(root, yscrollcommand=sb.set)
        sb.config(command=lb.yview)
        cw = CustomWidget(root)
    
        for char in list("abcdefghijklmnopqrstuvwxyz"):
            lb.insert(END, char)
    
        cw.pack()
        lb.pack()
        sb.pack()
    
        root.update()
        root.mainloop()
