2016-02-29 301 views
4

我收到以下错误在我Kivy应用程序,但我不知道为什么,以及如何解决它:基本上Kivy“NoneType”对象有没有属性“IDS”

File "main.py", line 16, in __init__ 
self.seq_text_box = self.parent.ids.seq_text_box 
AttributeError: 'NoneType' object has no attribute 'ids' 

,所有我想要做的是访问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() 

.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 

我感谢你的帮助:)

回答

1

您可以存储seq_text_boxMenuBarObjectProperty和设置在kv文件:

class MenuBar(BoxLayout): 
    seq_text_box = ObjectProperty() 
    def go(self): 
     print(self.seq_text_box.text) 

,并在kv文件:

<MinuRoot>: 
    orientation: "vertical" 
    MenuBar: 
     seq_text_box: seq_text_box 
    SequenceTextBox: 
     id: seq_text_box 

您会收到错误是因为在构造函数中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 

这将安排到init_eq_text_box呼吁下一帧,当ids将被填充。

相关问题