Kivy:按下时更改 TwoLineListItem 文本

Kivy: change TwoLineListItem text when press

我有这段代码可以读取我存储中的文件,它 return 在 TwoLineListItem 中。

示例:如果我有 2 个文件,将 return 2 TwoLineListItem。

代码:

from kivymd.app import MDApp
from kivymd.uix.boxlayout import BoxLayout
from kivymd.uix.floatlayout import FloatLayout
from kivymd.uix.button import MDRectangleFlatButton
from kivymd.uix.list import TwoLineListItem
from kivymd.uix.list import OneLineListItem
from kivymd.uix.selection import *
from kivymd.uix.textfield import MDTextField
from kivy.lang import Builder
from kivy.properties import StringProperty
import os

KV = '''
ScreenManager:
    Screen:
        name: 'telaSelecionada'
        BoxLayout:
            orientation: 'vertical'
            MDToolbar:
                id: tb
                title: ''
                md_bg_color: 0, 0, 0, 1
            TelaSelecionada:
                id: telaselecionada
        
<TelaSelecionada>:  
    ScrollView:
        MDList:
            id: mostraReceita


'''

class TelaSelecionada(FloatLayout):
    pass

class Aplicativo(MDApp):
    def on_start(self):
        self.listarReceitaBebida()
        
    def build(self):
        return Builder.load_string(KV)
        
    def listarReceitaBebida(self):
        dir1 = '/storage/emulated/0/Receitas/BEBIDAS'
        os.chdir(dir1)
        self.root.ids.telaselecionada.ids.mostraReceita.clear_widgets()
        dic = {}
        i = 1
        for file in os.listdir():
            if file.endswith('.txt'):
                file_path = f"{dir1}/{file}"
                with open(file_path, 'r') as f:
                    lines = f.readlines()   
                    lines = [line.strip() for line in lines]
                    st_idx = lines.index("receita")
                    md_idx = lines.index("preparo")
                    ed_idx = lines.index("...")
                    l = lines[st_idx:ed_idx]
                    self.textLine = TwoLineListItem(text = str(l[1]), secondary_text = str(l[3]), on_press = self.abrirReceita)
            self.root.ids.telaselecionada.ids.mostraReceita.add_widget(self.textLine)
            self.root.ids.telaselecionada.ids.mostraReceita.ids[str(i)] = self.textLine
            i += 1
            self.dic = {self.textLine.text: file_path}      
            
    def abrirReceita(self,instance):
        self.textLine.text = str(instance)
        
Aplicativo().run()

我想做的是当我按下第一个按钮时,第一个按钮的文本会改变,当按下第二个按钮时,第二个按钮会改变。

我的问题是当我点击任何按钮时,只有最后一个被改变。

此处,self.textLine.text(在 for 循环之外)指的是 for 循环中最后添加的项目。这就是为什么只有最后一项的文本发生变化的原因。您需要做的是访问实例并更改其文本。

因此您可能需要进行更改,

    def abrirReceita(self,instance):
        instance.text = str(instance)