How do I bind <MouseWheel> to scrollbar?

N

Nicholas Shewmaker

(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(event):
print "scrolled", event.delta, event

root = Tk()

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

myScrollbar = Scrollbar(root, command=myListbox.yview)
myScrollbar.bind('<MouseWheel>', reportScroll)
myScrollbar.focus_set()
myScrollbar.pack(side=RIGHT, fill=Y)

myListbox.config(yscrollcommand=myScrollbar.set)

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?
 
J

James Stroud

Nicholas said:
(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(event):
print "scrolled", event.delta, event

root = Tk()

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

myScrollbar = Scrollbar(root, command=myListbox.yview)
myScrollbar.bind('<MouseWheel>', reportScroll)
myScrollbar.focus_set()
myScrollbar.pack(side=RIGHT, fill=Y)

myListbox.config(yscrollcommand=myScrollbar.set)

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?

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(SCROLL, -1, UNITS))
myListbox.bind('<Button-5>', lambda e, s=self: \
s._scroll(SCROLL, 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:

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52266

(and the discussion that follows).

James
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,955
Messages
2,570,117
Members
46,705
Latest member
v_darius

Latest Threads

Top