Kivy开发:为何无法从MenuScreen类获取number_list列表?
问题原因及修复方案
核心问题
number_list是MenuScreen.submit()方法里的局部变量,只在方法执行时存在,不属于类或实例属性,所以MenuScreen.number_list根本不存在,自然访问不到。- 你直接通过类名
MenuScreen访问属性,但Kivy的Screen是实例化使用的,必须操作具体的屏幕实例,而非类本身。 - 额外问题:
GuessScreen.guess()里的correct变量未定义,会触发NameError;MenuScreen.submit()依赖self.text,但只有调用process()后这个属性才会被赋值,存在空值风险。
修复后的代码示例
from kivy.uix.screenmanager import Screen, ScreenManager class MenuScreen(Screen): def process(self): # 把输入内容存为实例属性,供submit方法使用 self.input_text = self.ids.input.text print(self.input_text) def submit(self): # 将number_list设为实例属性,让其他实例能访问 self.number_list = [] # 先检查输入是否为纯数字,避免非数字字符报错 if self.input_text.isdigit(): for i in self.input_text: self.number_list.append(int(i)) else: print("请输入纯数字内容") class GuessScreen(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) # 初始化correct状态为实例属性 self.correct = True def guess(self, number, menu_screen): # 接收MenuScreen的实例,通过实例访问number_list if not hasattr(menu_screen, 'number_list'): print("先去菜单页面提交数字") return if self.correct: if number in menu_screen.number_list: print("Correct, next number") # 移除已猜中的数字,防止重复猜测 menu_screen.number_list.remove(number) if not menu_screen.number_list: print("所有数字都猜完啦!") else: print("Wrong") self.correct = False # 示例使用:创建屏幕管理器和实例 sm = ScreenManager() menu_screen = MenuScreen(name='menu') guess_screen = GuessScreen(name='guess') sm.add_widget(menu_screen) sm.add_widget(guess_screen) # 模拟操作流程 menu_screen.process() # 假设输入框内容是"123" menu_screen.submit() guess_screen.guess(1, menu_screen)
关键修复点
- 把
number_list改成MenuScreen的实例属性(用self.number_list),这样每个屏幕实例都有自己的列表数据。 GuessScreen的guess方法接收MenuScreen的实例,通过实例访问number_list,而不是直接操作类。- 将
correct设为GuessScreen的实例属性,解决未定义的错误。 - 添加输入有效性检查,避免非数字字符导致的异常。
内容的提问来源于stack exchange,提问作者Aron Fredriksson
相关产品推荐
相关产品推荐

