You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:24:07