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:

python
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:

python
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:

python
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