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 resolver el ‘AttributeError’ de Kivy?

Estoy creando una aplicación utilizando KivyMD.

El archivo main.py tiene dos clases:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.widget import Widget 

<p>class Button_Functions (Widget):
    def function1 (self):
        # es llamada al presionar un cierto botón</p>

<p>class App (MDApp):
    def build (self):
        return Builder.load_file("screen.kv") </p>

<p>App().run()
<code>
El archivo screen.kv está estructurado de la siguiente manera:
</code>css
MDScreen:
    MDBoxLayout:
        Widget1:
        Widget2:
        Widget3: </p>

<p><Widget1@MDBoxLayout>:
    ...
<Widget2@MDGridLayout>:
    ...
<Widget3@MDBoxLayout>:
    MDRaisedButton:
        text: "Raised Button"
        on_press: root.function1()

El problema ocurre cuando intento presionar el botón para llamar a la función1, entonces obtengo el error “AttributeError: el objeto ‘Widget3’ no tiene el atributo ‘function1′”.

¿Cómo resuelvo este problema?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema es que el método function1 está definido en la clase Button_Functions, pero se está llamando en la clase Widget3. Para solucionar esto, debes establecer explícitamente que el widget raíz sea una instancia de la clase Button_Functions en tu archivo screen.kv.

    Aquí te muestro cómo hacerlo:

    Reemplaza la línea

    MDScreen:
        MDBoxLayout:
            Widget1:
            Widget2:
            Widget3:
    

    con

    <button_functions>:
        MDBoxLayout:
            Widget1:
            Widget2:
            Widget3:
    

    Esto establecerá el widget raíz como una instancia de la clase Button_Functions, y ahora podrás llamar al método function1 desde Widget3 de la siguiente manera:

    <widget3@mdboxlayout>:
        MDRaisedButton:
            text: "Botón elevado"
            on_press: app.root.function1()
    

    Esto debería solucionar el problema y permitirte llamar al método function1 desde la pulsación del botón.</widget3@mdboxlayout>

Comments are closed.