I have a Python Tkinter Text widget with scrollbars. I would like to define my own method for using horizontal edge scrolling on my laptop\'s touchpad. However, I don\'t kno
I just wanted to add on that on MacOS as no where tells this and I spent quite a bit of time experimenting and searching. The event.state changes from 0 for vertical mouse scroll and 1 for horizontal mouse scroll.
def mouseScroll(event):
if event.state == 0:
canvas.y_viewscroll(-event.delta, "units")
elif event.state == 1: # you can use just an else as it can only be 0 or 1
canvas.x_viewscroll(-event.delta, "units")
I investigated code relating to printing general events, made code to do that for button presses (not just key presses) and I saw what event.num
is for the horizontal mousewheel. So, I did the following solution:
I don't think there are event names for horizontal mouse scrolling (tell me if I'm wrong), but there do appear to be event numbers (which are 6 for scrolling left and 7 for scrolling right). While "<Button-6>"
and "<Button-7>"
don't seem to work, horizontal edge scrolling is still possible in Tkinter in Python 3.5.3 on Linux (I haven't tested anything else).
You'll need to bind "<Button>"
instead of "<Button-6>"
and "<Button-7>"
, and make a handler something like this:
...
self.bind("<Button>", self.touchpad_events)
...
def touchpad_events(self, event):
if event.num==6:
self.xview_scroll(-10, "units")
return "break"
elif event.num==7:
self.xview_scroll(10, "units")
return "break"
I do a return "break"
in each section of the if/elif statement because we don't want to return "break" all the time and interrupt other button events (only when the horizontal mousewheel is scrolled); I mean, if you break all the time regular left-clicking won't work anymore (unless you program it in), and stuff like that. I just do 10
and -10
instead of event.delta/120
because it gives me the following error otherwise for some odd reason, and just putting in numbers manually seems to work great:
tkinter.TclError: expected integer but got "0.0"
Anyway, I tested this solution and it works. Problem solved. :)