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

Python Kivy MDList动态列表点击无法获取项文本问题

解决方案

这个错误通常是因为动态生成OneLineListItem时,点击事件的绑定方式有误——要么是lambda表达式没有正确捕获循环中的当前项数据,要么是事件处理方法里错误地尝试访问不存在的属性。

正确实现方式

以下是两种可行的解决思路:

方法1:直接传递列表项实例到事件处理函数

在动态生成项时,绑定点击事件并将列表项本身作为参数传递,之后在处理函数中直接获取其text属性:

from kivymd.app import MDApp
from kivymd.uix.list import OneLineListItem, MDList
from kivymd.uix.screen import MDScreen

class TestApp(MDApp):
    def build(self):
        screen = MDScreen()
        self.md_list = MDList()
        screen.add_widget(self.md_list)
        
        # 动态生成列表项
        item_texts = ["Item 1", "Item 2", "Item 3", "Item 4"]
        for text in item_texts:
            item = OneLineListItem(text=text)
            # 绑定点击事件,传递当前item实例
            item.bind(on_press=self.on_item_selected)
            self.md_list.add_widget(item)
        
        return screen
    
    def on_item_selected(self, instance):
        # 直接从实例获取文本
        print(f"选中的文本:{instance.text}")
        # 这里可以根据需求处理文本,比如赋值给变量、更新UI等

if __name__ == "__main__":
    TestApp().run()

方法2:用lambda捕获当前项的文本

如果不想传递整个实例,可以在lambda中显式捕获当前循环的文本值,避免循环变量引用问题:

from kivymd.app import MDApp
from kivymd.uix.list import OneLineListItem, MDList
from kivymd.uix.screen import MDScreen

class TestApp(MDApp):
    def build(self):
        screen = MDScreen()
        self.md_list = MDList()
        screen.add_widget(self.md_list)
        
        item_texts = ["Item 1", "Item 2", "Item 3", "Item 4"]
        for text in item_texts:
            item = OneLineListItem(text=text)
            # 用lambda捕获当前text,注意要把text作为默认参数传入,避免循环变量覆盖
            item.bind(on_press=lambda _, current_text=text: self.on_item_selected(current_text))
            self.md_list.add_widget(item)
        
        return screen
    
    def on_item_selected(self, text):
        print(f"选中的文本:{text}")

if __name__ == "__main__":
    TestApp().run()

错误原因说明

  • 如果之前用了lambda x: self.on_item_click(item.text),循环结束后item会指向最后一个生成的列表项,导致所有点击都返回最后一项的文本。
  • 出现AttributeError: 'super' object has no attribute '__getattr__',大多是因为事件绑定代码中错误地引用了self的某个不存在的属性,或者在KV语言外错误使用了类似KV的属性访问语法(比如root.xxx)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:03:19