CustomTkinter鼠标滚轮滚动失效,绑定事件不工作求助
解决CustomTkinter Canvas鼠标滚轮滚动失效问题
针对Windows系统下CustomTkinter Canvas鼠标滚轮绑定无效的问题,从代码中可定位出几个关键问题,对应修复方案如下:
问题1:事件绑定的变量引用错误
绑定<Mousewheel>事件时,lambda表达式中使用的canvas变量尚未被赋值为self.canvas,导致调用时无法找到正确的Canvas对象,需直接使用self.canvas。
问题2:事件绑定目标覆盖不全
仅绑定到Canvas时,若Canvas未获取焦点或鼠标悬停在内部的scrollable_frame上,滚轮事件可能无法被捕获,需同时绑定到顶层窗口和scrollable_frame。
问题3:缺失滚动区域更新逻辑
代码中绑定了<Configure>事件到_on_frame_configure但未实现该方法,导致Canvas的滚动区域无法随scrollable_frame的大小变化而更新,即便滚轮事件生效也看不到滚动效果。
修改后的完整代码片段
class Game(ctk.CTkToplevel): def __init__(self, master=None): global fråge_font global alt_font fråge_font = ctk.CTkFont(family=FONT1, size=FRÅGA_FONT, weight="bold") alt_font = ctk.CTkFont(family=FONT1, size=FRÅGA_FONT) super().__init__(master, fg_color="grey15") self.title("Guest Window") self.geometry("0x0") self.state("zoomed") #self.attributes("-fullscreen", True) self.protocol("WM_DELETE_WINDOW", self.on_close) self.bind("<Escape>", lambda event: self.quit()) self.ruta = {} self.canvas = ctk.CTkCanvas(self) self.scrollbar = ctk.CTkScrollbar(self, orientation="vertical", command=self.canvas.yview) self.scrollable_frame = ctk.CTkFrame(self.canvas, fg_color="grey15") # 修复:绑定到顶层窗口和scrollable_frame,确保滚轮事件被捕获 self.bind("<MouseWheel>", lambda event: self.canvas.yview_scroll(int(-event.delta/120), "units")) self.scrollable_frame.bind("<MouseWheel>", lambda event: self.canvas.yview_scroll(int(-event.delta/120), "units")) self.scrollable_frame_window = self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw") self.canvas.configure(yscrollcommand=self.scrollbar.set) self.canvas.pack(expand=True, fill="both") self.scrollbar.place(relx=1, rely=0.05, anchor="ne", relheight=0.9) self.scrollable_frame.bind("<Configure>", self._on_frame_configure) self.game_widgets() # 补充:实现滚动区域更新方法 def _on_frame_configure(self, event): self.canvas.configure(scrollregion=self.canvas.bbox("all")) def on_close(self): self.destroy()
额外说明
- Windows系统下鼠标滚轮事件为
<MouseWheel>(首字母大写),原代码中的<Mousewheel>大小写错误会导致事件无法触发。 event.delta在Windows下为±120的倍数,除以120得到滚动单位,添加负号是为了匹配常规的滚动方向,可根据实际效果调整正负。
内容的提问来源于stack exchange,提问作者Elis Sunden Cullberg
相关产品推荐
相关产品推荐

