我在 Kivy 应用程序中收到以下错误,但我不确定原因以及如何修复它:
File "main.py", line 16, in __init__
self.seq_text_box = self.parent.ids.seq_text_box
AttributeError: 'NoneType' object has no attribute 'ids'
Run Code Online (Sandbox Code Playgroud)
基本上,我想做的就是访问类方法中的文本框MenuBar。我对此很陌生,所以很可能我误解了一些东西。
.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()
Run Code Online (Sandbox Code Playgroud)
.kv 文件
MinuRoot:
<MinuRoot>:
orientation: "vertical"
MenuBar
SequenceTextBox
id: seq_text_box
<MenuBar>:
height: "40dp"
size_hint_y: None
Button:
text: "Go!"
on_press: root.go()
<SequenceTextBox>:
focus: True
Run Code Online (Sandbox Code Playgroud)
我感谢您的帮助 :)
您可以存储seq_text_box为ObjectPropertyofMenuBar并将其设置在kv文件中:
class MenuBar(BoxLayout):
seq_text_box = ObjectProperty()
def go(self):
print(self.seq_text_box.text)
Run Code Online (Sandbox Code Playgroud)
并在kv文件中:
<MinuRoot>:
orientation: "vertical"
MenuBar:
seq_text_box: seq_text_box
SequenceTextBox:
id: seq_text_box
Run Code Online (Sandbox Code Playgroud)
您收到错误的原因是因为在构造函数中ids尚未根据文件中指定的规则填充kv。
如果您确实想使用普通属性,您可以安排一个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
Run Code Online (Sandbox Code Playgroud)
init_eq_text_box这将安排对下一帧的调用,何时ids填充。