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

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


我在kv中制作了一个小部件,但我想从py引用它,然后将其再次添加到kv中的另一个小部件中。我尝试使用 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()

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


哆啦的时光机
浏览 87回答 1
1回答

GCT1015

您可以使用Factory来创建已在 中定义的类的实例kv。所以你的GetCount班级可以是:from kivy.factory import Factoryclass GetCount(Screen):&nbsp; &nbsp; count_input = ObjectProperty(None)&nbsp; &nbsp; def next(self):&nbsp; &nbsp; &nbsp; &nbsp; # Setup next screen&nbsp; &nbsp; &nbsp; &nbsp; for _ in range(int(self.count_input.text)):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new_word_entry = Factory.WordEntry()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.manager.ids.get_input.ids.grid.add_widget(new_word_entry)&nbsp; &nbsp; &nbsp; &nbsp; # Switch to next screen&nbsp; &nbsp; &nbsp; &nbsp; self.manager.current = "get_input"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python