如何让CustomTkinter框架内按钮实现框架外页面切换?
解决CustomTkinter框架内按钮控制外部元素的问题
问题出在你直接调用App.switch_frame(ScrollFrame)——switch_frame是App类的实例方法,必须用App的实际对象(实例)来调用,而不是类本身,你的调用相当于没找对真正要操作的窗口实例,所以没反应。
下面是具体的修改步骤:
1. 给侧边栏框架传递App实例
修改FunctionsSidebarFrame的初始化方法,让它接收App的实例并保存:
class FunctionsSidebarFrame(customtkinter.CTkFrame): def __init__(self, master, app_instance, **kwargs): super().__init__(master, **kwargs) self.app = app_instance # 保存主窗口App的实例 # 重新定义按钮的命令 self.view_game_list_btn = customtkinter.CTkButton( self, text="View Game List", command=self.trigger_switch_frame # 绑定到自定义方法 ) self.view_game_list_btn.pack(pady=10) # 新增触发切换的方法 def trigger_switch_frame(self): self.app.switch_frame(ScrollFrame) # 用保存的App实例调用切换方法
2. 创建侧边栏时传入App实例
在App类中创建FunctionsSidebarFrame的时候,把self(也就是当前App的实例)传进去:
class App(customtkinter.CTk): def __init__(self): super().__init__() # ...其他窗口初始化代码... # 创建侧边栏时传入App实例 self.sidebar = FunctionsSidebarFrame(self, app_instance=self) self.sidebar.pack(side="left", fill="y") # 原主窗口的切换按钮(对比参考) self.switch_btn = customtkinter.CTkButton( self, text="Switch to Scroll Frame", command=lambda: self.switch_frame(ScrollFrame) ) self.switch_btn.pack(pady=20) # 你的页面切换方法(确保是实例方法,第一个参数是self) def switch_frame(self, frame_class): # 这里是你的切换逻辑,比如销毁当前框架、创建新框架 if hasattr(self, "current_frame"): self.current_frame.destroy() self.current_frame = frame_class(self) self.current_frame.pack(fill="both", expand=True)
关键原理
这样修改后,侧边栏里的按钮通过保存的App实例,调用的是和主窗口按钮完全相同的switch_frame方法,自然能实现一模一样的页面切换效果。
如果你之前的switch_frame方法逻辑没问题,这样改完就能正常工作了。
内容的提问来源于stack exchange,提问作者Lex Richter
相关产品推荐
相关产品推荐

