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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:12:48