2016-03-20 18 views
0

Mit einem Knopfdruck, Ich füge Widgets zu einem FloatLayout innerhalb eines ScrollView. Der Code ist ein wenig zu groß, so schließe ich einen Pastebin linkFalsche Widget Positionierung in Kivy

Also in diesem Code, wenn ich eine Taste drücken (wenn es ein Text in dem unteren TextInput ist), erstellt es eine Instanz von Message, scheint aber zu Ignoriere alle Platzierungs- und Größenanleitungen und lege sie in die untere linke Ecke mit der Standardgröße (100x100). Warum passiert dies? Ich habe versucht, das pos Attribut beim Erstellen einer Instanz (z. B. msg_stack.append(Message(pos=(50, 50))), aber es wurde auch ignoriert. Ich habe auch versucht, die FloatLayout durch eine RelativeLayout zu ersetzen, hat nicht funktioniert. Auch, ist FloatLayout, was ich in dieser Situation bleiben muss? Vielleicht könnte eine GridLayout mir besser tun?

+0

Setzen Sie die Positionierung in 'Message()' selbst, da 'Widget 'standardmäßig' pos = [0,0] 'und' size = [100,100] 'hat. 'msg_stack.append (Nachricht (pos = [200,100]))' zum Beispiel. – KeyWeeUsr

+0

@KeyWeeUsr, yea, ich erwähnte das versuchen, immer noch das gleiche :( – Leva7

+1

Sie sollten das Programm neu schreiben, bis es klein ist. Solche Unordnung schiebt Sie in die Wartung Hölle. Schreiben Sie nichts ** in 'Build' Methode, enthält alle Logik innerhalb von Widgets und Struktur in kv-Datei/String. – jligeza

Antwort

0

Die Sache ist Ihr Message() an bestimmten possition, aber Widgets innen nicht - sie sind in der Standardposition.

einfach, dies werden Sie zeigen, und die docs (die rote Warnung) erklärt, dass Sie die Positionierung der Kinder allein zu verwalten haben, weil es nicht zum Beispiel ist BoxLayout, sondern ein einfaches Widget und es nimmt den Standardwert für jeder add_widget()

<Message>: 
    canvas: 
     Color: 
      rgba: 1, 0, 0, 1 
     Rectangle: 
      size:self.size 
      pos: self.pos 

Und die Position innerhalb der Nachricht() gesetzt, wenn Sie es in ein anderes Widget Message(pos=[200,200])

auch hinzufügen, den Code ... das ist Schmerz, ja, aber die größte <Registerkarte> f verwendet oder Einrückung. Es ist schick, dass es funktioniert. Nutze stattdessen 4 Felder, damit du dir in Zukunft keine Sorgen mehr machen musst. Und vermeiden Sie die Verwendung von Funktion innerhalb der Funktion, wenn Sie es nicht brauchen, um sich so zu verhalten.

Um es zu beheben ersetzen Sie einfach alle self mit root in Ihrer Nachricht() und innere Widgets manuell mit pos=root.pos und so weiter positionieren.