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)
我有这段代码可以读取我存储中的文件,它 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)