How do I bind <MouseWheel> to scrollbar?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Nicholas Shewmaker

    #1

    How do I bind <MouseWheel> to scrollbar?

    (I apologize if this posts twice. My AVG is being fussy.)

    From what I've read, MouseWheel is a very tricky event. I have
    replaced my Python tcl84.dll and tk84.dll files with those in the
    ActiveTcl distribution to fix the crashes caused by the event. Then, I
    managed to see that my test script (see code below) was registering the
    event by printing the delta value (+/- 120).

    -----------------
    from Tkinter import *

    def reportScroll(ev ent):
    print "scrolled", event.delta, event

    root = Tk()

    myListbox = Listbox(root, selectmode=SING LE, height=10, width=20)
    for x in range(30):
    myListbox.inser t(END, x)
    myListbox.pack( side=LEFT, expand=YES, fill=BOTH)

    myScrollbar = Scrollbar(root, command=myListb ox.yview)
    myScrollbar.bin d('<MouseWheel> ', reportScroll)
    myScrollbar.foc us_set()
    myScrollbar.pac k(side=RIGHT, fill=Y)

    myListbox.confi g(yscrollcomman d=myScrollbar.s et)

    root.mainloop()
    -----------------

    The scrollbar and listbox are tied together, but moving the wheelmouse
    does nothing. I realize the code above doesn't give the event any real
    duties, but I'm not really sure how to make that leap. How and to what
    do I bind <WheelMouse> so that it will affect the listbox and the scrollbar?
  • James Stroud

    #2
    Re: How do I bind &lt;MouseWheel& gt; to scrollbar?

    Nicholas Shewmaker wrote:[color=blue]
    > (I apologize if this posts twice. My AVG is being fussy.)
    >
    > From what I've read, MouseWheel is a very tricky event. I have
    > replaced my Python tcl84.dll and tk84.dll files with those in the
    > ActiveTcl distribution to fix the crashes caused by the event. Then, I
    > managed to see that my test script (see code below) was registering the
    > event by printing the delta value (+/- 120).
    >
    > -----------------
    > from Tkinter import *
    >
    > def reportScroll(ev ent):
    > print "scrolled", event.delta, event
    >
    > root = Tk()
    >
    > myListbox = Listbox(root, selectmode=SING LE, height=10, width=20)
    > for x in range(30):
    > myListbox.inser t(END, x)
    > myListbox.pack( side=LEFT, expand=YES, fill=BOTH)
    >
    > myScrollbar = Scrollbar(root, command=myListb ox.yview)
    > myScrollbar.bin d('<MouseWheel> ', reportScroll)
    > myScrollbar.foc us_set()
    > myScrollbar.pac k(side=RIGHT, fill=Y)
    >
    > myListbox.confi g(yscrollcomman d=myScrollbar.s et)
    >
    > root.mainloop()
    > -----------------
    >
    > The scrollbar and listbox are tied together, but moving the wheelmouse
    > does nothing. I realize the code above doesn't give the event any real
    > duties, but I'm not really sure how to make that leap. How and to what
    > do I bind <WheelMouse> so that it will affect the listbox and the
    > scrollbar?[/color]

    I don't think <MouseWheel> is a real event in Tkinter. Try binding to
    <Button-4> and <Button-5>:

    myListbox.bind( '<Button-4>', lambda e, s=self: \
    s._scroll(SCROL L, -1, UNITS))
    myListbox.bind( '<Button-5>', lambda e, s=self: \
    s._scroll(SCROL L, 1, UNITS))

    These have worked for me on Linux and OS X. They probably work under
    windows if you are lucky.

    You will need to bind the scrollbar separately if you want it to respond
    to the mousewheel.

    See also:



    (and the discussion that follows).

    James

    Comment

    Working...