多页面Tkinter应用中如何调用tkraise()切换其他类内存储的Frame
根因分析
该问题由Python的闭包迟绑定特性导致:在for循环内部定义lambda函数时,如果直接引用循环变量,函数不会在定义阶段捕获变量的当前值,只会在实际被调用时读取变量的最终值。
你提供的代码中,侧边栏按钮的lambda绑定逻辑跑完6次循环后,循环变量ids的最终值为5,对应页面列表的最后一项SyncPage,因此所有按钮点击后都会跳转到同步页面。
修复方案
给lambda函数添加默认参数即可解决问题,默认参数会在函数定义阶段完成求值,每次循环迭代都会将当前ids的取值存入对应lambda的默认参数中,保证每个按钮绑定的页面索引正确。
修改SideBar类中按钮的command参数:
原错误写法:
command=lambda: ctl.show_page(page_name[ids])
修复后写法:
command=lambda ids=ids: ctl.show_page(page_name[ids])
内容的提问来源于stack exchange,提问作者Corecaps
相关产品推荐
相关产品推荐

