Kivy跨Screen调用方法无法访问ID,出现AttributeError求助
错误原因及修复方案
错误根源
你在Login类的log方法里调用ViewDecks.ShowDecks(self)时,传入的self是Login页面的实例,而非ViewDecks页面的实例。Login的ids集合里没有deck_scroll这个控件ID,因此执行self.ids.deck_scroll时触发AttributeError。
修复步骤
1. 修正Login类中调用ShowDecks的方式
在Login的log方法中,先获取ViewDecks页面的实例,再传递user_id并调用其方法:
def log(self): # ... 省略原有校验与数据库查询代码 ... else: self.user_id = existing[0] self.manager.current = "deck_view" # 获取ViewDecks页面实例 view_decks_screen = self.manager.get_screen("deck_view") # 传递user_id并调用ShowDecks view_decks_screen.ShowDecks(self.user_id) print(self.user_id)
2. 修改ViewDecks类的ShowDecks方法
让方法接收user_id参数,避免依赖外部实例属性:
class ViewDecks(Screen): def ShowDecks(self, user_id): try: mydb = mysql.connector.connect( host="localhost", user="root", passwd="root", database="mydb" ) mycursor = mydb.cursor() except: dialog = MDDialog( text="Error, connection is not established try again later", buttons=[MDRaisedButton(text='OK', on_release=lambda x: dialog.dismiss())] ) dialog.open() return # 连接失败时终止方法 mycursor.execute('SELECT deck_name FROM decks WHERE user_id = %s', (user_id,)) decks = mycursor.fetchall() deck_list = self.ids.deck_scroll # 清空原有卡片,避免重复添加 deck_list.clear_widgets() for deck_name in decks: deck_card = MDCard(orientation='horizontal', size_hint=(None, None), size=(200, 300)) deck_card.add_widget(MDLabel(text=deck_name[0])) deck_list.add_widget(deck_card) # 关闭数据库连接 mydb.close()
3. 优化KV文件中的ScrollView布局
为确保ScrollView正常滚动,给内部BoxLayout添加必要属性:
<ViewDecks>: name:"deck_view" BoxLayout: orientation :'horizontal' ScrollView: BoxLayout: orientation:'vertical' id:deck_scroll size_hint_y: None # 取消垂直方向自动适配 height: self.minimum_height # 高度随子控件总高度调整 spacing: 10 # 可选:增加卡片间距 padding: 10 # 可选:增加内边距
额外提示
- 调用页面方法时,必须使用对应页面的实例,不能跨实例调用(比如用Login实例调用ViewDecks的方法)。
- 数据库操作完成后记得关闭连接,避免连接泄漏。
- 每次调用
ShowDecks前清空原有控件,防止重复登录时卡片叠加。
内容的提问来源于stack exchange,提问作者bigvideostudios
相关产品推荐
相关产品推荐

