【问题标题】:KivyMD Dynamic Tab Management with different 'iterations' of tabs具有不同“迭代”选项卡的 KivyMD 动态选项卡管理
【发布时间】:2020-12-06 18:40:37
【问题描述】:

我使用了 KivyMD 文档中有关“动态选项卡管理”的代码,因此用户可以添加/删除选项卡。但是,创建的每个选项卡显然都是相同的,因此我放入其中的小部件也是如此。这意味着,如果我尝试从 例如 Tab 3 获取所述小部件的 id,则没有办法这样做,因为它与 相同的 id 例如 Tab 1 中的小部件。代码如下:

.py 文件

def on_start(self):
    self.add_tab()

def get_tab_list(self):
    print(self.root.ids.addworkouts.ids.tabs.get_tab_list())

def add_tab(self):
    self.index += 1
    self.root.ids.addworkouts.ids.tabs.add_widget(Tab(text=f"Exercise {self.index}"))

def remove_tab(self):
    self.index -= 1
    self.root.ids.addworkouts.ids.tabs.remove_widget(
        self.root.ids.addworkouts.ids.tabs.get_tab_list()[0]
    )

.kv 文件

<AddWorkouts>
name: 'AddWorkouts'
tabs: tabs

BoxLayout:
    orientation: 'vertical'

    MDToolbar:
        title: ' '#app.getWorkoutName()
        type: 'top'
        left_action_items: [['keyboard-backspace', lambda x: app.goBacktoMyWorkouts()]]
        #md_bg_color: app.theme_cls.accent_color
        elevation: 10


    FloatLayout:
        canvas:
            Color:
                rgba: 0, 0, 0.5, 0.9
            Rectangle:
                pos: self.pos
                size: self.size

        MDTabs:
            id: tabs

        FloatLayout:
            canvas:
                Color:
                    rgba: 1, 1, 1, 1
                Rectangle:
                    size: self.size
                    pos: self.pos

            pos_hint: {'center_x': 0.5, 'y': 0.1}
            size_hint: 0.8, 0.6


            MDTextField:
                pos_hint: {'x': 0.05, 'y': 0.8}
                size_hint: 0.6, None
                hint_text: 'Exercise Name'
                helper_text_mode: 'on_focus'
                required: 'True'
                multiline: False


<Tab>

    MDList:

        MDBoxLayout:
            adaptive_height: True
            md_bg_color: 1, 1, 1, 1

            MDFlatButton:
                text: "ADD EXERCISE"
                text_color: 16/255, 167/255, 249/255, 1
                on_release: app.add_tab()

            MDFlatButton:
                text: "REMOVE LAST EXERCISE"
                text_color: 16/255, 167/255, 249/255, 1
                on_release: app.remove_tab()

Tab 1,其中 MDTextField 中的输入为“Hi”:

Tab2,其中 MDTextField 中的输入与 Tab 重复:

是否仍然让用户能够添加和删除选项卡,但是让所有小部件(如 .kv 文件中的 MDTextField )具有不同的 ID,以便我可以访问用户输入从他们?提前谢谢你,如果这个问题的措辞不好,请询问更多信息!

【问题讨论】:

    标签: python kivy kivymd


    【解决方案1】:

    ids 仅为在 kv 规则中创建的小部件填充。因此,在.kv 文件之外创建的任何Tab 都不会输入到ids 字典中。但是,您可以通过修改您的 add_tab() 方法将它们入侵到 ids

    import weakref
    def add_tab(self):
        self.index += 1
        new_tab = Tab(text=f"Exercise {self.index}")
        new_id = 'tab_' + str(self.index)
        self.root.ids.addworkouts.ids.tabs.add_widget(new_tab)
        self.root.ids.addworkouts.ids.tabs.ids[new_id] = weakref.ref(new_tab)
    

    这会将new_id 添加到MDTabs 中的ids

    要使MDTextField 成为Tab 的一部分,只需将其添加到&lt;Tab&gt; 规则中即可。可能是这样的:

    <Tab>
        MDList:
            MDTextField:
                size_hint: 0.6, None
                hint_text: 'Exercise Name'
                helper_text_mode: 'on_focus'
                required: 'True'
                multiline: False
    
            MDBoxLayout:
                adaptive_height: True
                md_bg_color: 1, 1, 1, 1
    
                MDFlatButton:
                    text: "ADD EXERCISE"
                    text_color: 16/255, 167/255, 249/255, 1
                    on_release: app.add_tab()
    
                MDFlatButton:
                    text: "REMOVE LAST EXERCISE"
                    text_color: 16/255, 167/255, 249/255, 1
                    on_release: app.remove_tab()
    

    当然,您可以从&lt;AddWorkouts&gt; 规则中删除MDTextField(及其封闭的FloatLayout)。

    【讨论】:

    • 这可行,但 MDTextField 中的输入仍然在选项卡之间重复。如果我在选项卡 1 的文本字段中键入“嗨”,然后添加另一个选项卡,则消息会复制过来。如何更改它,以便每次新标签迭代“刷新”小部件?
    • MDTextField不在Tab中,它在AddWorkoutsScreen内的FloatLayout中。所以改变标签对它没有影响。它没有被复制,它只是不是Tab 的一部分。
    • 啊,好吧,这更有意义。所以我想要的是为每个选项卡单独的 FloatLayouts 以便 MDTextField 会有所不同?我该怎么做?
    • 感谢@JohnAnderson,我接近解决同样的问题,但它得到这个错误“AttributeError:'MainApp'对象没有属性'index'
    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多