2017-04-18 2 views
0

Hallo Jungs, ich bin neu mit Kivy, ich mache einen kleinen Code, der den Eingabewert und setzen Sie es auf den Widget Kinder Wert.Wie setze ich einen Wert auf ein bestimmtes Widget Kinder

Das Ziel ist, dass, wenn ich auf die Schaltfläche Hinzufügen klicke, das Widget der ersten Zeile hinzugefügt wird und den Wert von TextInput annimmt. Und wenn ich den TextInput-Wert ändere und auf Hinzufügen klicke, wird eine zweite Zeile des Widgets hinzugefügt und es wird der neue TextInput-Wert enthalten.

Bitte lesen Sie meinen Code:

from kivy.uix.widget import Widget 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.textinput import TextInput 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.label import Label 
from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.lang import Builder 
from kivy.uix.button import Button 


kv_string = Builder.load_string(''' 

<CustomRemBtn>: 
    Button: 
     id: remBtn 
     text: 'Remove' 

<CostumWidget>: 
    TextInput: 
     size_hint_x: None 
     width: 150 
    TextInput: 
     size_hint_x: None 
     width: 150 

<MScreen>: 
    FloatLayout: 
     Button: 
      pos: root.x,root.top-self.height 
      id: main_add 
      text: 'Add' 
      size_hint: .1,.05 
      on_release: root.add_customWidget(True) 
     TextInput: 
      pos: root.x,root.top-main_add.height-self.height 
      id: textIn 
      size_hint: .3,.05 

      ''') 

class CustomRemBtn(BoxLayout): 
    def remove(self): 
     self.parent.removeFunction() 

class CostumWidget(BoxLayout): 
    def labelers(self): 
     self.parent.floatbase() 

class Float_Layout(FloatLayout): 
    def floatbase(self): 
     self.parent.add_customWidget() 
    def removeFunction(self): 
     self.parent.remove_customWidget() 

class AddRem(Widget): 
    def __init__(self,**kwargs): 
     super(AddRem,self).__init__(**kwargs) 
     self.orientation = "vertical" 
     self.count = 0 
     self.customLayout = Float_Layout() 
     self.add_widget(self.customLayout) 

class MScreen(Screen,AddRem): 
    def add_customWidget(self,*args): 
     self.y1 = (self.top - ((self.count+1)*40)-110) 

     self.count += 1 
     self.custWidgets = CostumWidget(size_hint=(.1,.05), pos=(100, 480-(self.count*30))) 
     self.removeBtn = CustomRemBtn(size_hint=(.1,.05), pos=(400, 480-(self.count*30))) 

     if self.count == 1: 
      self.customLayout.add_widget(self.custWidgets) 
      self.customLayout.add_widget(self.removeBtn) 
     else: 
      self.customLayout.remove_widget(self.customLayout.children[0]) 
      self.customLayout.add_widget(self.custWidgets) 
      self.customLayout.add_widget(self.removeBtn) 

     for i2 in self.customLayout.children: 
      for x in range(len(i2.children)): 
       i2.children[x].text=self.ids.textIn.text 
       print(i2.children[x].text) 


class myApp1(App): 
    def build(self): 
     return SManage 

SManage = ScreenManager() 
SManage.add_widget(MScreen()) 

if __name__ == "__main__": 
    myApp1().run() 

aber mein Problem ist, dass es mit meinem Code nicht funktioniert und im stuck, jedes Mal wenn ich den Wert des TextInput- ändern, werden alle Widget Kinder den gleichen Wert haben .

Vielen Dank und ich hoffe auf eine Lösung oder irgendwelche Vorschläge.

Antwort

0

Ich würde eine Klasse namens Row zum Beispiel erstellen. Wenn dann die Schaltfläche "Hinzufügen" in dieser Zeile gedrückt wird, wird eine Methode in der Root-Klasse aufgerufen, um eine weitere Zeile mit den gewünschten Parametern hinzuzufügen.
Gefällt mir:

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import StringProperty 
from kivy.lang import Builder 


Builder.load_string(''' 

<Row>: 
    orientation: 'horizontal' 
    Label: 
     text: root.inp 
    Button: 
     text: 'Add' 
     on_release: 
      app.root.add(input.text) 
    TextInput: 
     id: input 

''') 


class Row(BoxLayout): 
    inp = StringProperty("") 

    def __init__(self,inp,**kwargs): 
     super(Row,self).__init__(**kwargs) 
     self.inp = inp 


class MyLayout(BoxLayout): 

    def __init__(self,**kwargs): 
     super(MyLayout,self).__init__(**kwargs) 
     self.orientation = "vertical" 
     self.add_widget(Row("First added")) 

    def add(self,inp): 
     self.add_widget(Row(inp)) 


class MyApp(App): 

    def build(self): 
     return MyLayout() 


MyApp().run() 
Verwandte Themen