添加一个从 py 在 kv 中创建的小部件

Add a widget that was created in kv from py

有没有办法从 py 文件中引用自定义小部件?

我在kv中做了一个widget,但是我想从py中引用它,然后再将它添加到kv中的另一个widget。 我尝试使用 id 执行此操作,但出现错误 (KeyError: 'words_entry')。

这是我试过的:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.textinput import TextInput
import os


class GetCount(Screen):

    count_input = ObjectProperty(None)

    def next(self):

        # Setup next screen
        text_inputs = [self.ids.words_entry for i in range(int(self.count_input.text))]

        for text_input in text_inputs:
            self.manager.ids.get_input.ids.grid.add_widget(text_input)

        # Switch to next screen
        self.manager.current = "get_input"


class GetInput(Screen):
    pass


kv_file = Builder.load_string("""
ScreenManager:

    GetCount:
        name: "get_count"
        id: get_count

    GetInput:
        name: "get_input"
        id: get_input

<WordEntry@TextInput>:
    id: words_entry

    multiline: False
    size_hint: (self.width, None)

<GetCount>:
    
    count_input: count_input
    
    FloatLayout:
        
        Label:
            text: "count"
            size_hint: 1, 0.05
            pos_hint: {"top":0.9}

        TextInput:
            id: count_input 

            size_hint: 0.8, 0.05
            pos_hint: {"top":0.7, "x":0.1}
            multiline: False

        Button:
            text: "Next"
            on_release: root.next()
            size_hint: 0.8, 0.05
            pos_hint: {"top":0.5, "x":0.1}

<GetInput>:
    
    ScrollView:

        GridLayout:
            size_hint_y: None
            height: self.minimum_height
            id: grid

            cols: 1
""")


class MainApp(App):

    def build(self):
        return kv_file


if __name__ == "__main__":

    app = MainApp()
    app.run()

在这段代码中,我想从py中将WordEntry添加到GetInput中的GridLayout(原因是我需要根据用户的输入添加多个)。

您可以使用 Factory 创建已在 kv 中定义的 class 的实例。所以你的 GetCount class 可以是:

from kivy.factory import Factory

class GetCount(Screen):
    count_input = ObjectProperty(None)

    def next(self):
        # Setup next screen
        for _ in range(int(self.count_input.text)):
            new_word_entry = Factory.WordEntry()
            self.manager.ids.get_input.ids.grid.add_widget(new_word_entry)

        # Switch to next screen
        self.manager.current = "get_input"