2016-04-16 14 views
1

Wie ich eine Kivy App codiert habe, habe ich eine kleine width Eigenschaft in meine benutzerdefinierte Widget-Definition zum Testen: meine Funktion sollte eine neue Breite erstellt haben und diese sollte nirgendwo verwendet worden sein . Also habe ich vergessen, es im Laufe der Zeit zu entfernen. Aber jetzt, als ich den Code aufräumte und versuchte, ihn zu entfernen, brach die height des Widgets. Die Höhe ist ebenfalls dynamisch, aber soweit ich sehen kann, hat das nichts mit der anfänglichen Breite des Widgets zu tun, da die Erzeugung der Höhe erst erfolgt, nachdem die neue Breite zugewiesen wurde. Ich bin irgendwie verwirrt, was das verursacht. Hinweis: Ich verwende eine geschützte Eigenschaft, um die Höhe zu berechnen, vielleicht ist sie verantwortlich? Ich habe eine schnelle, schmutzige App zusammengestellt, die Hässlichkeit entschuldigen, aber ich habe versucht, den Code so weit wie möglich zu verkürzen.Kivy seltsame Breite Eigenschaft Folgen

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.label import Label 

global msg_stack 
msg_stack = [] 

Builder.load_string(''' 
<Custom>: 
    x: 5 
    width: 500 
    BoxLayout: 
     pos: root.pos 
     height: self.height 
     TextInput: 
      pos: root.pos 
      size: root.size 
      id: msg 
      readonly: True 
      text: str(msg) 
''') 
class Custom(Widget): 
    pass 

class TestApp(App): 
    def build(self): 
     msg = "A bunch of random words: words, words, words, words, words" 
     inst = Custom() 

     inst.ids['msg'].text = msg 

     inst.width = 500 
     inst.height = (len(inst.ids['msg']._lines_labels) + 1) * (inst.ids['msg'].line_height + 2) 

     for i in inst.walk(): 
      i.height = inst.height 
      i.width = inst.width 

     bl = BoxLayout(orientation="vertical") 
     bl.add_widget(inst) 
     return bl 

TestApp().run() 

Also, wenn diese Eigenschaft auf 500 festgelegt ist, ist die Höhe für die Menge der Zeilen gerade Fitting (Sie sehen, dass, wenn Sie mehr Text in die msg Variable hinzufügen). Aber wenn ich es zu etwas anderem wie 50 ändere, steigt plötzlich die Höhe. Hier

Antwort

0

ist ein Versuch, bei Dissektion:

Sie setzten ursprünglich die width von Custom bis 500. In build, Text die TextInput zugewiesen wird, die die Linien berechnet sie für die Anzeige von dieser ursprünglichen Größe benötigt, daher 1 Linie. Wenn Sie die width im kv-Teil vor der Instanziierung auf 50 setzen, benötigt die TextInput mehr Zeilen, um den Text anzuzeigen, und da keine Einschränkung auf height gesetzt wurde, ist es die Standard 100 (Sie können dies durch Auskommentieren sehen inst.width = ... und inst.height = ... in build). Nun, wenn wir inst.width = ... auskommentieren aber inst.height = ... verlassen, wird die Höhe geändert, weil wir in der Tat brauchen wir 16 Zeilen, um den ganzen Text anzuzeigen. Und die Einstellung inst.width = 500 kurz vor dieser Zeile macht den Container breit, dann wird die neue Höhe berechnet (die immer noch auf der TextInput Größe basiert, weil die BoxLayout nicht seine Größe ändert), dann gehen Sie durch die Kinder und setzen ihre Größen explizit auf die Custom Widget Größe, die die hohe Höhe hat.

Ich bin nicht sicher, was Sie am Ende erreichen wollen, aber dies sollte die Ergebnisse erklären, die Sie erhalten.