CTkScrollableFrame does not respond to Tk 9 <TouchpadScroll> events on macOS
Author: tomcope85-artCreated Jul 28, 2026Updated Aug 30, 2026
Environment
- macOS Tahoe
- Apple Silicon MacBook Pro
- Python 3.13.14
- Tk 9.0.3
- CustomTkinter 6.0.0
Problem
CTkScrollableFrame does not scroll using the Mac trackpad.
Dragging the scrollbar works normally, but trackpad gestures do nothing.
The problem occurs in this standalone example:
import customtkinter as ctk
app = ctk.CTk()
app.geometry("500x500")
print("Tk:", app.tk.call("info", "patchlevel"))
print("CustomTkinter:", ctk.__version__)
scroll_frame = ctk.CTkScrollableFrame(app)
scroll_frame.pack(
fill="both",
expand=True,
padx=20,
pady=20
)
for number in range(50):
ctk.CTkLabel(
scroll_frame,
text=f"Item {number + 1}"
).pack(pady=5)
app.mainloop()Findings
Binding <MouseWheel> does not receive trackpad events.
Tk 9 does generate <TouchpadScroll> events:
app.bind_all(
"<TouchpadScroll>",
lambda event: print(event.delta),
add="+"
)The event.delta value appears to contain packed horizontal and vertical signed 16-bit values.
The following workaround restores vertical scrolling:
def decode_touchpad_delta(raw_delta):
raw = raw_delta & 0xFFFFFFFF
delta_y = raw & 0xFFFF
delta_x = (raw >> 16) & 0xFFFF
if delta_y >= 0x8000:
delta_y -= 0x10000
if delta_x >= 0x8000:
delta_x -= 0x10000
return delta_x, delta_y
def trackpad_scroll(event):
_, delta_y = decode_touchpad_delta(event.delta)
if delta_y:
scroll_frame._parent_canvas.yview_scroll(
delta_y,
"units"
)
return "break"
app.bind_all(
"<TouchpadScroll>",
trackpad_scroll,
add="+"
)This suggests that CTkScrollableFrame handles <MouseWheel> events but does not yet handle Tk 9's <TouchpadScroll> events on macOS.
Source: TomSchimansky/CustomTkinter