为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2023-07-27 16:13:36
有没有办法从 py 文件引用自定义小部件?我在kv中制作了一个小部件,但我想从py引用它,然后将其再次添加到kv中的另一个小部件中。我尝试使用 id 执行此操作,但出现错误 ( KeyError: 'words_entry')。这是我尝试过的:from kivy.app import Appfrom kivy.uix.screenmanager import ScreenManager, Screenfrom kivy.lang import Builderfrom kivy.properties import ObjectPropertyfrom kivy.uix.textinput import TextInputimport osclass 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):    passkv_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_fileif __name__ == "__main__":    app = MainApp()    app.run()在这段代码中,我想添加WordEntry到来自py的GridLayoutin GetInput(原因是我需要根据用户的输入添加多个)。
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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


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"


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信