Herencia de reglas Kivy con add_widget ()

Pregunta de seguimiento: Kivy fuera de la inherencia de la regla

main.py

from kivy.app import App from kivy.uix.button import Button from kivy.uix.stacklayout import StackLayout from kivy.properties import ObjectProperty from kivy.factory import Factory class FancyButton(Button): imp = ObjectProperty(None) class Important(StackLayout): def NoInspiration(self, smile): print("Received: {}".format(smile)) def AddFancy(self): temp = Factory.FancyButton(text='f', imp = self.ids.imp) self.ids.boxy.add_widget(temp) class TestApp(App): def build(self): pass if __name__ == '__main__': TestApp().run() 

test.kv

 #:kivy 1.9.0 #:import App kivy.app : on_release: self.imp.NoInspiration(':)') : id: imp BoxLayout: id: boxy orientation: 'vertical' FancyButton: text: "smiley" imp: root Button: text: "add fancy" on_release: imp.AddFancy() BoxLayout: Important 

En test.kv, la función de llamada en FancyButton a la función NoInspiration () funciona porque el FancyButton definido en .kv tiene imp: root, por lo que sabe que debe buscar la función en :.

Pregunta

Sin embargo, ¿cómo funciona imp: root cuando crea FancyButton a través de add_widget en Python?

Ahora cuando presiono el botón “agregar fantasía” recibo el error:

Archivo “main.py”, línea 18, en AddFancy temp = Factory.FancyButton (text = ‘f’, imp = self.ids.imp) Archivo “properties.pyx”, línea 756, en kivy.properties.ObservableDict .__ getattr __ (kivy / properties.c: 11093) AttributeError: el objeto ‘super’ no tiene atributo ‘__getattr __’

Siguiente pregunta

Kivy fuera de la regla de la herencia 2

Widget.ids solo contiene ids de sus hijos ( http://kivy.org/docs/api-kivy.uix.widget.html#kivy.uix.widget.Widget.ids . La identificación del widget en sí no es necesaria porque usted solo puede pasarlo directamente, en su caso, usando self , ya que está pasando una referencia a un widget desde dentro de un método:

 class Important(StackLayout): def NoInspiration(self, smile): print("Received: {}".format(smile)) def AddFancy(self): print(self.ids) # only returns {'boxy': } self.ids.boxy.add_widget(FancyButton(text='f', imp = self)) # no need to use a factory