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.

Kivy imagen y DragBehavior

Estoy revisando la respuesta proporcionada en:
https://stackoverflow.com/questions/63617496/draggable-image-in-kivy
Que es más o menos lo que estoy buscando.
PERO
Al tratar de ejecutarlo tal como está (con el archivo kv y sin él), obtengo el error:

TypeError: conflicto de metaclases: la metaclase de una clase derivada debe ser una subclase (no estricta) de las metaclases de todas sus bases

Esto se debe a:

class MoveableImage(DragBehavior, Image):
pass

Intentar resolverlo con metaclass=DragBehavior me obligaría a cambiar el orden de los parámetros a:

class MoveableImage(Image, metaclass=DragBehavior):
pass

Y aún así, sigo obteniendo el mismo error de metaclase que antes.

¿Alguna idea?

Eli7

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que hay un conflicto entre las metaclases de las clases base (DragBehavior e Image) de las que MoveableImage hereda. Una posible solución es crear una nueva metaclase que herede de las metaclases de DragBehavior e Image, y luego usarla como la metaclase de MoveableImage.

    Aquí tienes un ejemplo:

    class MoveableImageMeta(type(DragBehavior), type(Image)):
        pass
    
    class MoveableImage(Image, DragBehavior, metaclass=MoveableImageMeta):
        pass
    

    Esto crea una nueva metaclase que hereda de las metaclases de DragBehavior e Image. MoveableImage luego usa esta nueva metaclase, lo que debería resolver el conflicto.

    Alternativamente, puedes intentar reorganizar el orden de herencia y usar la función super() para llamar a los métodos de ambas clases base. Aquí tienes un ejemplo:

    class MoveableImage(Image, DragBehavior):
    
        def __init__(self, **kwargs):
            super(MoveableImage, self).__init__(**kwargs)
            super(DragBehavior, self).__init__(**kwargs)
    

    Esto también debería resolver el conflicto al llamar explícitamente al método __init__() de cada clase base usando super().

    ¡Espero que esto te ayude! Avísame si tienes alguna pregunta adicional.

Comments are closed.