如何在Tkinter的类式Frame中调用另一个类式Frame的自定义函数
解决Tkinter多类Frame跨实例调用方法的问题
首先梳理你现有代码的2个核心问题
Update_class_b现在是class_B的__init__方法内的局部函数,作用域仅在__init__内部,外部实例根本无法访问- 你没有通过控制器拿到
class_B的实例对象,直接调用类本身的方法自然不会生效
具体修改步骤
第一步:修正class_B的定义,把Update_class_b改成公开实例方法
import tkinter as tk # 假设你已经定义了LARGEFONT常量 LARGEFONT = ("微软雅黑", 20) class class_B(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller # 保存控制器引用,方便后续使用 # 提前创建label,不要每次更新都新建,避免重复生成组件 self.label = tk.Label(self, text="", font=LARGEFONT) self.label.grid(row=1, column=0) # 组件定义 button = tk.Button(self, text="START_TRIP", command=lambda: controller.show_frame(D_file.D_class)) button.grid(row=2, column=0, padx=10, pady=10) # 移出__init__,变成类的实例方法,外部可访问 def Update_class_b(self): # 修改现有label的文本,不要重复创建label self.label.config(text="Welcome")
第二步:修改class_A的调用逻辑,通过控制器获取class_B实例调用方法
class class_A(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller # 保存控制器引用 def do_something_in_class_B(): # 从控制器的frames字典中取出class_B的实例,直接调用对应方法 class_b_instance = self.controller.frames[file_B.class_B] class_b_instance.Update_class_b() # 如果需要调用后直接跳转到class_B页面,可以加下面这行 # self.controller.show_frame(file_B.class_B) tk.Button(self, text="DO SOMETHING IN CLASS B", command=do_something_in_class_B).pack()
第三步:控制器代码不需要大改,注意你导入的类名大小写一致即可
你的控制器逻辑本身是对的,所有Frame实例都存在self.frames字典里,key就是对应的类,所以只要通过控制器就能拿到任意已经初始化的Frame实例,直接调用它的公开方法就行。
内容的提问来源于stack exchange,提问作者lexi
相关产品推荐
相关产品推荐

