class ScrollableFrame(ttk.Frame):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.canvas = tk.Canvas(self, highlightthickness=0)
self.scrollbar = ttk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.scrollbar.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.inner = ttk.Frame(self.canvas)
self.inner_id = self.canvas.create_window((0, 0), window=self.inner, anchor="nw")
self.inner.bind("<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))
self.canvas.bind("<Configure>", lambda e: self.canvas.itemconfig(self.inner_id, width=e.width))
# Rueda del mouse
self.canvas.bind_all("<MouseWheel>", self._on_mousewheel)
self.canvas.bind_all("<Button-4>", self._on_mousewheel)
self.canvas.bind_all("<Button-5>", self._on_mousewheel)
def _on_mousewheel(self, event):
if hasattr(event, "delta") and event.delta:
self.canvas.yview_scroll(-1 if event.delta > 0 else 1, "units")
else:
if getattr(event, "num", None) == 4:
self.canvas.yview_scroll(-1, "units")
elif getattr(event, "num", None) == 5:
self.canvas.yview_scroll(1, "units")
Comentarios
Publicar un comentario