2016-05-06 16 views
0

Ich habe den folgenden Code:Kivy GridLayout Zugriff auf Zeilen und Spalten gibt keine zurück.

class MyGridLayout(GridLayout): 
    def __init__(self, **kwargs): 
     super(MyGridLayout, self).__init__(**kwargs) 

class Board(Widget): 

    my_layout = ObjectProperty(None) 

    def __init__(self, **kwargs): 
     super(Board, self).__init__(**kwargs) 

    def on_my_layout(self, instance, value): 
     print self.my_layout.cols 

class MyApp(App): 

    def build(self): 
     return Board() 

if __name__ == '__main__': 
    MyApp().run() 

Und das ist meine kv-Datei:

<Board>: 
    my_layout: my_layout 
    MyGridLayout: 
     id: my_layout 
     cols: 10 
     rows: 10 

Auf Methode on_my_layout ich drucken möchten, wie viele cols meine Instanz MyGridLayout hat. Aber, es kommt mir immer keiner zurück. Wenn ich auf Zeilen zugreifen möchte, gibt es auch None zurück. Was muss ich in meinem Python-Code oder in meiner kivy-Sprache ändern, um auf die richtigen Werte der Zeilen und Spalten von MyGridLayout zuzugreifen? Es muss rows = 10 und cols = 10 zurückgeben.

Antwort

0
<Board>: 
    my_layout: my_layt ## This 
    MyGridLayout: 
     id: my_layt 
     cols: 10 
     rows: 10 

Es funktioniert nicht, weil Sie nicht vorhandenen Widget ObjectProperty zuweisen, daher YourObjectProperty.cols==None. Sie müssten dies grundsätzlich tun:

<Board>: 
    MyGridLayout: 
     id: my_layt 
     cols: 10 
     rows: 10 
    my_layout: my_layt ## This 

was einen Fehler in kv auslösen wird. Aber wenn Sie das in __init__() tun, so ist Ihr Widget bereits vorhanden und funktioniert, es wird es ohne Probleme drucken. Verwenden Sie nicht die gleichen Namen für ID und Variable, sonst funktioniert es überhaupt nicht.

class Board(Widget): 

    my_layout = ObjectProperty(None) 
    def __init__(self, **kwargs): 
     super(Board, self).__init__(**kwargs) 
     self.my_layout = self.ids.my_layt 
+0

Danke, es löste mein Problem. Kannst du mir sagen, warum die Methode 'on_my_layout' zuerst aufgerufen wird als'__init__'? – Caaarlos

+1

@Caaarlos nicht die Methode, _die Zuweisung ist first_. Die Methode wird aufgerufen, wenn Sie 'my_layout' ändern, das in .py eine' ObjectProperty' ist. Wenn Sie also etwas in .kv zuweisen, wird Ihr 'on_my_layout' ausgeführt und etwas ausgedruckt. Aus diesem Grund müssen Sie warten, bis das Widget initialisiert ist, und dann einer Variablen ein initialisiertes (aktuelles) Widget zuweisen, das Ihre Funktion aufruft. Der erste Code in meiner Antwort: Widget ist nicht vorhanden, wenn 'my_layout: my_layt'. – KeyWeeUsr

+0

Danke, jetzt weiß ich, was auf meinem Code passiert! – Caaarlos

Verwandte Themen