탭의 '반복'이 다른 KivyMD 동적 탭 관리

Aug 18 2020

사용자가 탭을 추가 / 삭제할 수 있도록 '동적 탭 관리'에 대한 KivyMD 문서의 코드를 사용했습니다. 그러나 생성 된 각 탭은 분명히 동일하므로 여기에 넣은 위젯도 마찬가지입니다. 이것은 들어 Tab 3 에서 해당 위젯의 ID 를 가져 오려고하면 예를 들어 Tab 1 의 위젯 과 동일한 ID 이므로 그렇게 할 수있는 방법이 없습니다 . 다음은 코드입니다.

.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()

MDTextField의 입력이 'Hi'인 탭 1 :

Tab2, MDTextField의 입력이 Tab에서 복제되었습니다.

어쨌든 여전히 사용자 추가 및 삭제 탭을하지만, 할 수있는 데 거기에 모든 그래서 (같은 위젯 MDTextField 내가 그들로부터 사용자 입력에 액세스 할 수 있도록 .kv 파일)은 서로 다른 ID를 가지고? 사전에 감사드립니다.이 질문이 잘못 되었다면 더 많은 정보를 요청하십시오!

답변

1 JohnAnderson Aug 17 2020 at 23:51

ids만에서 만든 위젯 채워집니다 kv규칙입니다. 따라서 파일 Tab외부에서 생성 .kv된 것은 ids사전에 입력되지 않습니다 . 그러나 방법 ids을 수정하여 해킹 할 수 있습니다 add_tab().

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받는 사람을 idsMDTabs.

MDTextField일부 를 만들려면 규칙에 Tab추가하기 만하면 <Tab>됩니다. 아마도 다음과 같습니다.

<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()

물론 규칙 에서 MDTextField(및 그 포함 FloatLayout)을 제거합니다 <AddWorkouts>.