KivyMD Dynamic Tab Management ที่มี 'การวนซ้ำ' ของแท็บที่แตกต่างกัน

Aug 18 2020

ฉันใช้รหัสจากเอกสาร KivyMD เกี่ยวกับ 'การจัดการแท็บแบบไดนามิก' เพื่อให้ผู้ใช้สามารถเพิ่ม / ลบแท็บได้ อย่างไรก็ตามแต่ละแท็บที่สร้างขึ้นนั้นมีความเหมือนกันอย่างเห็นได้ชัดดังนั้นวิดเจ็ตที่ฉันใส่ไว้ก็เช่นกัน ซึ่งหมายความว่าถ้าฉันพยายามที่จะใช้ ID ของวิดเจ็ตกล่าวว่าจากเช่นแท็บ 3ไม่มีทางที่จะทำเช่นนั้นมันเป็นรหัสเดียวกันเป็นเครื่องมือในเช่นแท็บ 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()

แท็บ 1 โดยที่อินพุตใน MDTextField คือ 'Hi':

Tab2 โดยที่อินพุตใน MDTextField ซ้ำกันจาก Tab:

อย่างไรก็ตามยังคงมีผู้ใช้ที่สามารถเพิ่มและลบแท็บได้ แต่ทำให้วิดเจ็ตทั้งหมด (เช่นMDTextFieldในไฟล์. kv) มีรหัสที่แตกต่างกันเพื่อให้ฉันสามารถเข้าถึงอินพุตของผู้ใช้จากพวกเขาได้หรือไม่ ขอขอบคุณล่วงหน้าหากคำถามนี้มีคำพูดไม่ดีโปรดขอข้อมูลเพิ่มเติม!

คำตอบ

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เข้าไปidsในไฟล์MDTabs.

ในการสร้าง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>กฎ