es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo insertar un MDList en un MDDialog en kivyMD?

Necesito mostrar los datos de un diccionario en un ThreeLineListItem dentro de un MDDialog, pero mi código parece no funcionar.

Aquí está mi código:

from kivymd.uix.dialog import MDDialog
from kivymd.uix.button import MDRaisedButton, MDFlatButton
from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.boxlayout import BoxLayout
from kivymd.uix.list import ThreeLineListItem
from kivymd.uix.snackbar import Snackbar
from kivy.properties import ObjectProperty

KV='''
WindowManager:
    MainWindow:
    SecondWindow:

<dialogcontent>
    confirm_check_in_list: confirm_check_in_list
    id: confirm_check_in_dialog
    orientation: "vertical"
    spacing: dp(20)
    size_hint_y: None
    size_hint_x: None
    height: self.height
    width: self.width

    AnchorLayout:
        adaptive_height: True
        ScrollView:

            MDList:
                id: confirm_check_in_list


<mainwindow>
    name: 'main'
    MDBoxLayout:
        orientation: 'vertical'
        MDToolbar:
            title: 'test';



        MDBoxLayout:
            orientation:'vertical'
            spacing: dp(10)
            padding: dp(20)


            MDRaisedButton:
                text: 'Click me'
                on_release:
                    app.show_dialog()

'''

product_dict={'name 1': (1, 2), 'name 2': (3,4), 'name 3':(4,2)}


class MainWindow(Screen):
    pass

class SecondWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class DialogContent(BoxLayout):
    confirm_check_in_list=ObjectProperty()
    def check_conflicts(self, conflicts):
        for name, quantity in conflicts.items():
            self.ids.confirm_check_in_list.add_widget(
                ThreeLineListItem(text=f'{name}',
                    secondary_text=f'q1: {quantity[0]}',
                    tertiary_text=f'q2: {quantity[1]}',
                )
            )


class MainApp(MDApp):

    dialog=None

    def build(self):
        self.theme_cls.theme_style="Dark"
        self.theme_cls.primary_palette="Green"
        return Builder.load_string(KV)

    def close_dialog(self, obj):
        self.dialog.dismiss()

    def confirm_selection(self, obj):
        #check number in quantity field

        Snackbar(text='Success').open()

    def show_dialog(self):
        DialogContent().check_conflicts(product_dict)

        if not self.dialog:
            self.dialog=MDDialog(
                title='Check products',
                type='custom',
                content_cls=DialogContent(),
                buttons=[
                    MDFlatButton(
                        text='CANCEL',
                        theme_text_color="Custom",
                        text_color=self.theme_cls.primary_color,
                        on_release=self.close_dialog
                    ),
                    MDRaisedButton(
                        text='OK',
                        theme_text_color="Custom",
                        on_release=
                            self.confirm_selection

                    )
                ],
            )
        self.dialog.open()


MainApp().run()

¿Necesito importar los valores para el MDList del archivo KV?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    No, es necesario importar los valores para MDList desde el archivo KV. El problema en el código proporcionado es que DialogContent está siendo instanciado varias veces y los elementos de la lista están siendo añadidos a diferentes instancias de confirm_check_in_list. Para solucionar esto, puedes crear una instancia separada de DialogContent y añadirla a la instancia de MDDialog:

    class MainApp(MDApp):
        dialog = None
        dialog_content = None
    
        def build(self):
            self.theme_cls.theme_style = "Dark"
            self.theme_cls.primary_palette = "Green"
            return Builder.load_string(KV)
    
        def close_dialog(self, obj):
            self.dialog.dismiss()
    
        def confirm_selection(self, obj):
            # check number in quantity field
            Snackbar(text='Success').open()
    
        def show_dialog(self):
            if not self.dialog_content:
                self.dialog_content = DialogContent()
    
            self.dialog_content.check_conflicts(product_dict)
    
            if not self.dialog:
                self.dialog = MDDialog(
                    title='Comprobar productos',
                    type='custom',
                    content_cls=self.dialog_content,
                    buttons=[
                        MDFlatButton(
                            text='CANCELAR',
                            theme_text_color="Custom",
                            text_color=self.theme_cls.primary_color,
                            on_release=self.close_dialog
                        ),
                        MDRaisedButton(
                            text='ACEPTAR',
                            theme_text_color="Custom",
                            on_release=self.confirm_selection
                        )
                    ],
                )
            self.dialog.open()
    

    Esto creará una única instancia de DialogContent y la reutilizará cada vez que se muestre el diálogo. Además, puedes comprobar si dialog_content ya ha sido creado antes de crear una nueva instancia.

Comments are closed.