2017-09-15 4 views
0

Ich versuche, dynamisch ein Kivy-Layout mit einem vertikalen BoxLayout zu erstellen, das eine variierende Anzahl von benutzerdefinierten MyRow Widgets enthält, die zur Laufzeit geändert werden können. layout example jede Zeile eine horizontale BoxLayoutKivy verschachtelte BoxLayout stapelt Widgets auf der linken unteren Ecke

Ich bin ein Gridlayout nicht verwenden, da MyRow Layout entwickelt wird und in naher Zukunft ändern können Widgets usw. wie in diesem Beispiel layout example 2

Aber mit dem Code hinzufügen unten bekomme ich nur kleine Widgets in der unteren linken Ecke des Fensters übereinander gestapelt.

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import StringProperty 

class MyRow(Widget): 
    a = StringProperty('a') 
    b = StringProperty('b') 

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

class MainScreen(Widget): 

    rows = [['a1','b1'],['a2','b2']] #example data 

    mainLayout = BoxLayout(orientation='vertical', spacing=5) 

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

     self.add_widget(self.mainLayout) 

     for r in self.rows: 
      row_widget = MyRow() 

      row_widget.a = r[0] 
      row_widget.b = r[1] 

      self.mainLayout.add_widget(row_widget) 

class MyApp(App): 

    def build(self): 
     return MainScreen() 

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

und dies ist die kv-Datei:

<MyRow> 
    BoxLayout: 
     orientation: "horizontal" 
     spacing: 30 
     Label: 
      id: a_label 
      text: root.a 
     Label: 
      id: b_label 
      text: root.b 

Antwort

1

In Ihrer Skizze sagt es MyRow auf einer horizontalen BoxLayout basiert. Aber es ist nicht. Es ist bauen auf widget

Einfach

class MyRow(Widget): 

zu

class MyRow(BoxLayout): 

Ändern wird Ihr Problem lösen.

enter image description here


Um Abstand rechts oder besser würde ich Ihren Code auf die folgende

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import StringProperty 
from kivy.base import Builder 



class MyRow(BoxLayout): 
    a = StringProperty('a') 
    b = StringProperty('b') 

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

class MainScreen(BoxLayout): 

    rows = [['a1','b1'],['a2','b2']]*5 

    def __init__(self, **kwargs): 
     super(MainScreen, self).__init__(**kwargs) 
     self.orientation = "vertical" 

     for r in self.rows: 
      row_widget = MyRow() 

      row_widget.a = r[0] 
      row_widget.b = r[1] 

      self.add_widget(row_widget) 



class MyApp(App): 

    def build(self): 
     return MainScreen() 

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

und Ihre kv

<MyRow>: 
    orientation: "horizontal" 
    spacing: 30 
    Label: 
     id: a_label 
     text: root.a 
    Label: 
     id: b_label 
     text: root.b 

aktualisieren, die Sie enter image description here

gibt

von einem Boxlayot ​​in Python Verwendung class Row(BoxLayout): in kv-Datei verwenden, um erben <[email protected]>:

+0

Wurde Ihre Frage beantwortet? Wenn dies in Betracht gezogen wird, oder wenn es Ihnen nur geholfen hat, können Sie darüber nachdenken, es zu erhöhen. – PalimPalim

Verwandte Themen