I wanted to implement two finger scrolling in tkinter. Here is the result of my own attempt:
import tkinter as tk
class Scene:
def __init__(self, canvas):
self.canvas = canvas
self.elements = [
{
"type": "rect",
"x": canvas.winfo_width() / 2,
"y": canvas.winfo_height() / 2,
"width": 200,
"height": 200,
"color": (55 / 255, 55 / 255, 10 / 255),
},
{
"type": "rect",
"x": 100,
"y": 300,
"width": 200,
"height": 200,
"color": (155 / 255, 200 / 255, 10 / 255),
},
]
def update_scene(self, offset):
for element in self.elements:
element["x"] -= offset[0]
element["y"] -= offset[1]
self.render_scene()
def render_scene(self):
self.canvas.delete("all")
for element in self.elements:
if element["type"] == "rect":
self.canvas.create_rectangle(
element["x"],
element["y"],
element["x"] + element["width"],
element["y"] + element["height"],
fill=f"#{int(element['color'][0] * 255):02x}{int(element['color'][1] * 255):02x}{int(element['color'][2] * 255):02x}",
)
else:
print(f"Error: type {element['type']} is not supported.")
root = tk.Tk()
root.geometry("{}x{}".format(800, 600))
canvas = tk.Canvas(root)
canvas.pack(fill="both", expand=True)
canvas_scroll = [0, 0]
scene = Scene(canvas)
scene.render_scene()
def on_mouse_scroll(event):
canvas_scroll[0] = event.delta
canvas_scroll[1] = event.delta
scene.update_scene(canvas_scroll)
canvas.bind("<MouseWheel>", on_mouse_scroll)
root.mainloop()
The above only works in one diagonal/direction, instead of any direction (up, down, left, right, and all four diagonals)
The above was inspired by a Javascript snippet I found here: https://jsfiddle.net/qmyho24r/
I know using Shift-MouseWheel
works, but then I have to also press the shift key, instead of just using the trackpad and two fingers (like in the Javascript example).
How can I use two fingers scrolling in Tkinter?