Kivy:如何访问在 python 代码中创建的 ID

Kivy: how to access IDs created in python code

我在下面有这段代码。我已经通过python代码设置了id,但是我无法访问。

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

我想在按下时用ID号更改文本。

示例:如果我输入第一个按钮,将文本更改为“1”,这是我传递的 ID。

from kivymd.app import MDApp
from kivymd.uix.boxlayout import BoxLayout
from kivymd.uix.floatlayout import FloatLayout
from kivymd.uix.list import TwoLineListItem
from kivymd.uix.textfield import MDTextField
from kivy.lang import Builder
import os
from kivy.core.window import Window
import sqlite3

KV = '''
ScreenManager:  
    Screen:
        name: 'telaSelecionada'
        BoxLayout:
            orientation: 'vertical'
            MDToolbar:
                id: tb
                title: 'Drinks'
                md_bg_color: 0, 0, 0, 1
            TelaSelecionada:
                id: telaselecionada
    

<TelaSelecionada>:  
    ScrollView:
        MDList:
            id: mostraReceita
            padding: '20dp'
'''

Window.softinput_mode = "below_target"

class TelaSelecionada(FloatLayout):
    pass

class Aplicativo(MDApp):
    def build(self):
        return Builder.load_string(KV)
            
    def on_start(self):
        i = 1
        for x in range(5):
            self.textLine = TwoLineListItem(text = 'change text', secondary_text = 'change text')
            self.root.ids.telaselecionada.ids.mostraReceita.add_widget(self.textLine)
            self.root.ids.telaselecionada.ids.mostraReceita.ids[i] = self.textLine
            self.textLine.bind(on_release = self.abrirReceita)
            i += 1
            
            
    def abrirReceita(self,instance):
        instance.text = str(instance.ids)

Aplicativo().run()

如何从 python 代码访问 ID?

I'd like to change the text with the number of the ID when I press.

只需通过方法 abrirReceita 传递所需的参数,使用 functools.partial 作为,

    def on_start(self):
            ...
            self.textLine.bind(on_release = partial(self.abrirReceita, i))
            i += 1

# Then in `abrirReceita` :

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

注:

这里根本没有使用 ids(实际上你在这里不需要 目的 )!


更新:

因为,Widget.id 自版本 2.0.0 以来一直是 deprecated 你应该只在 kvlang 中使用它 而不是 python.

但这并不妨碍您将其创建为动态添加的属性。因此你可以这样做(我稍微修改了 on_start 方法):

    def on_start(self):
        mostraReceita = self.root.ids.telaselecionada.ids.mostraReceita
        for i, _ in enumerate(range(5), start=1):
        # Or just,
        # for i in range(1, 5+1):
            self.textLine = TwoLineListItem(
                text = 'change text',
                secondary_text = 'change text',
            )
            self.textLine.index = i
            # Or even,
            # self.textLine.id = i
            self.textLine.bind(on_release = self.abrirReceita)
            mostraReceita.add_widget(self.textLine)


    def abrirReceita(self,instance):
        instance.text = str(instance.index) # or, str(instance.id)