By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,658 Members | 1,596 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,658 IT Pros & Developers. It's quick & easy.

How do I bind <MouseWheel> to scrollbar?

P: n/a
(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?
Dec 14 '05 #1
Share this Question
Share on Google+
1 Reply


P: n/a
Nicholas Shewmaker wrote:
(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/Coo...n/Recipe/52266

(and the discussion that follows).

James
Dec 15 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.