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

如何在tkinter中从兄弟类调用方法配置控件文本内容

问题根因

你触发的AttributeError本质是混淆了类和类实例的访问规则:

  • board1、configure_leaderboard()等属性/方法是LeaderboardPage类的实例成员,只有实例化后的对象才拥有该属性
  • 你直接通过LeaderboardPage.xxx调用属于类访问,类本身不会持有实例初始化时创建的控件属性,自然报错。
修复步骤

1. 修正排行榜页面实例的调用方式

MultiPage控制器的frames字典中已经存储了所有页面的实例对象,不需要重新创建实例,直接从控制器获取即可。修改MainMenu.button2_f()方法:

def button2_f(self, controller):
    controller.show_frame(LeaderboardPage)
    # 从控制器获取已初始化的LeaderboardPage实例
    lb_page = controller.frames[LeaderboardPage]
    # 重置文件指针到头部,读取最新的文件内容
    LeaderboardPage.Lista_Igraca.seek(0)
    # 重新统计最新的玩家数量
    lb_page.num_igraca_class = sum(1 for line in open('Lista_Igraca.txt', 'r'))
    # 调用实例方法刷新排行榜
    new_leaderboard = lb_page.leaderboard_creation()
    lb_page.configure_leaderboard(new_leaderboard)

2. 优化静态方法声明

write_to_leaderboard方法没有实例参数,需要添加静态方法装饰器避免调用报错:

@staticmethod
def write_to_leaderboard(name, wins, losses):
    # 原有逻辑保持不变
    if not os.path.isfile('Lista_Igraca.txt'):
        Lista_Igraca = open('Lista_Igraca.txt', 'x')
        Lista_Igraca.close()
    
    Lista_Igraca = open('Lista_Igraca.txt', 'r')
    num_igraca = sum(1 for line in Lista_Igraca)
    Lista_Igraca.close() 

    fajl_unos = str(f'{num_igraca+1}.\t{name}\t{wins}\t{losses}\n')
    
    Lista_Igraca = open("Lista_Igraca.txt", "a")
    Lista_Igraca.write(str(fajl_unos))
    Lista_Igraca.close()

    LeaderboardPage.num_igraca_class += 1

3. 可选优化(建议修改)

当前在类定义阶段直接打开文件句柄的方式容易出现缓存问题,建议每次读取排行榜数据时临时打开文件,避免文件更新后读取不到最新内容的问题:
修改leaderboard_creation()方法,移除对类变量Lista_Igraca的依赖,每次调用时重新打开文件读取:

def leaderboard_creation(self):
    Igraci_Printout = []
    # 每次读取时重新打开文件,保证拿到最新数据
    with open('Lista_Igraca.txt', 'r') as f:
        # 按当前页码跳过前面的行
        offset = self.br_stranice * 9
        for _ in range(offset):
            if not f.readline():
                break
        # 读取最多9行数据
        for _ in range(9):
            line = f.readline().strip()
            Igraci_Printout.append(line if line else '')
    # 记录是否还有下一页的标识
    self.igrac_class = Igraci_Printout[-1] if len(Igraci_Printout)==9 and Igraci_Printout[-1] else ''
    return Igraci_Printout

内容的提问来源于stack exchange,提问作者Cewu00

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 00:15:06