如何在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
相关产品推荐
相关产品推荐

