Recibo el siguiente error en mi aplicación Kivy, pero no estoy seguro de por qué y cómo solucionarlo:
File "main.py", line 16, in __init__ self.seq_text_box = self.parent.ids.seq_text_box AttributeError: 'NoneType' object has no attribute 'ids'
Básicamente, todo lo que estoy tratando de hacer es acceder al cuadro de texto dentro de los métodos de la clase MenuBar
. Soy nuevo en esto, así que es probable que esté malinterpretando algo.
archivo .py
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.textinput import TextInput class SequenceTextBox(TextInput): pass #... class MenuBar(BoxLayout): def __init__(self, **kwargs): super(MenuBar, self).__init__(**kwargs) self.seq_text_box = self.parent.ids.seq_text_box def go(self): print(self.seq_text_box.text) class MinuRoot(BoxLayout): pass class MinuApp(App): pass if __name__ == '__main__': MinuApp().run()
archivo .kv
MinuRoot: : orientation: "vertical" MenuBar SequenceTextBox id: seq_text_box : height: "40dp" size_hint_y: None Button: text: "Go!" on_press: root.go() : focus: True
Aprecio tu ayuda 🙂
Puede almacenar seq_text_box
como ObjectProperty
de MenuBar
y configurarlo en el archivo kv
:
class MenuBar(BoxLayout): seq_text_box = ObjectProperty() def go(self): print(self.seq_text_box.text)
y en el archivo kv
:
: orientation: "vertical" MenuBar: seq_text_box: seq_text_box SequenceTextBox: id: seq_text_box
La razón por la que recibe el error es porque en el constructor los ids
no se han completado a partir de las reglas especificadas en el archivo kv
.
Si desea usar un atributo simple, puede progtwigr un evento de Clock
:
class MenuBar(BoxLayout): def __init__(self, **kwargs): super(MenuBar, self).__init__(**kwargs) Clock.schedule_once(self.init_seq_text_box, 0) def init_seq_text_box(self, *args): self.seq_text_box = self.parent.ids.seq_text_box
Esto progtwigrá una llamada a init_eq_text_box
para el siguiente fotogtwig, cuando se rellenarán los init_eq_text_box
.