2016-02-29 250 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將被填充。

相關問題