Python Tkinter同级类间方法调用问题求助
解决Tkinter类结构中跨子类调用方法的AttributeError问题
错误原因
你遇到的AttributeError: 'Frame' object has no attribute 'button_function',本质是你调用方法的对象是Tkinter原生Frame类实例,而非自定义的RightMenu子类实例。通常是父类MainGrid没有正确保存自定义子类的引用,或者LeftMenu中获取的是基类Frame而非子类对象。
修正方案
1. 父类MainGrid正确保存子类实例
在MainGrid中创建LeftMenu和RightMenu时,必须将实例赋值给自身属性,确保后续能通过父类拿到子类对象:
import tkinter as tk class MainGrid(tk.Tk): def __init__(self): super().__init__() self.title("GUI Demo") # 保存自定义子类实例到父类属性 self.left_menu = LeftMenu(self) self.right_menu = RightMenu(self) # 布局组件 self.left_menu.pack(side="left", fill="y", padx=5, pady=5) self.right_menu.pack(side="right", fill="both", expand=True, padx=5, pady=5)
2. LeftMenu中通过父类引用调用RightMenu方法
在LeftMenu的按钮回调里,通过保存的父类引用,直接访问RightMenu实例并调用目标方法:
class LeftMenu(tk.Frame): def __init__(self, parent): super().__init__(parent) self.parent = parent # 保存父类实例引用 # 创建Run按钮,绑定回调 run_btn = tk.Button(self, text="Run", command=self.on_run_click) run_btn.pack(pady=10, padx=10) def on_run_click(self): # 通过父类的right_menu属性调用目标方法 self.parent.right_menu.call_text_area()
3. 确保RightMenu实现目标方法
确认RightMenu类中正确定义call_text_area方法,操作自身的文本元素:
class RightMenu(tk.Frame): def __init__(self, parent): super().__init__(parent) # 创建文本区域 self.text_area = tk.Text(self, wrap=tk.WORD) self.text_area.pack(fill="both", expand=True) def call_text_area(self): # 示例操作:向文本区域插入内容 self.text_area.insert(tk.END, "Run按钮已触发操作!\n")
关键注意点
- 不要在父类中直接将子类实例当成
Frame丢弃,必须保存为父类的属性; - 子类初始化时要保存父类引用,方便跨子类调用;
- 确保目标方法确实存在于对应的子类中,避免拼写错误。
内容的提问来源于stack exchange,提问作者Palio
相关产品推荐
相关产品推荐

