how to add an integer value in a loop

I have two files demo.py and demo.kv Can anyone help me?

1 . +Add More add a line dynamic.After the fill value, when I click on Total Value , then it shows the line as 151012 . Do not show 12+10+15=37 . I use code for this

  test = '' for val in values: test = val[2]+test self.total_value.text = test 

2 . Can someone tell me how to put the sum of the value in the Total Value TextBox after filling in the value TextBox, and not click on the Total Value Box.Means How to call the def test(self) function from the value TextBox?


demo.py

 from kivy.uix.screenmanager import Screen from kivy.app import App from kivy.lang import Builder from kivy.core.window import Window from kivy.uix.boxlayout import BoxLayout from kivy.properties import BooleanProperty, ListProperty, StringProperty, ObjectProperty, NumericProperty from kivy.uix.textinput import TextInput from kivy.uix.button import Button Window.clearcolor = (0.5, 0.5, 0.5, 1) Window.size = (500, 400) class User(Screen): total_value = ObjectProperty(None) def add_more(self): self.ids.rows.add_row() def test(self): values = [] rows = self.ids.rows for row in reversed(rows.children): vals = [] for ch in reversed(row.children): if isinstance(ch, TextInput): vals.append(ch.text) if isinstance(ch, Button): vals.insert(0, ch.text) values.append(vals) test = '' for val in values: test = val[2]+test self.total_value.text = test class Row(BoxLayout): col_data = ListProperty(["?", "?", "?", "?", "?"]) button_text = StringProperty("") col_data3 = StringProperty("") col_data4 = StringProperty("") def __init__(self, **kwargs): super(Row, self).__init__(**kwargs) class Rows(BoxLayout): row_count = 0 def __init__(self, **kwargs): super(Rows, self).__init__(**kwargs) self.add_row() def add_row(self): self.row_count += 1 self.add_widget(Row(button_text=str(self.row_count))) class Test(App): def build(self): self.root = Builder.load_file('demo.kv') return self.root if __name__ == '__main__': Test().run() 

demo.kv

 <Row>: size_hint_y: None height: self.minimum_height height: 40 Button: text: root.button_text size_hint_x: None top: 200 TextInput: text: root.col_data3 width: 300 TextInput: text: root.col_data4 width: 300 <Rows>: size_hint_y: None height: self.minimum_height orientation: "vertical" User: total_value:total_value BoxLayout: orientation: "vertical" padding : 20, 5 BoxLayout: orientation: "horizontal" #padding : 10, 10 spacing: 10, 10 size: 450, 40 size_hint: None, None Label: size_hint_x: .2 text: "Number" text_size: self.size valign: 'bottom' halign: 'center' Label: size_hint_x: .4 text: "name" text_size: self.size valign: 'bottom' halign: 'center' Label: size_hint_x: .4 text: "Value" text_size: self.size valign: 'bottom' halign: 'center' ScrollView: Rows: id: rows BoxLayout: orientation: "horizontal" padding : 10, 5 spacing: 10, 10 size: 200, 40 size_hint: None, None Label: size_hint_x: .7 text: "Total value" TextInput: id: total_value on_focus:root.test() BoxLayout: orientation: "horizontal" size_hint_x: .2 size_hint_y: .2 Button: text: "+Add More" on_press: root.add_more() 

that would be very helpful if you could.

+7
python kivy kivy-language
source share
2 answers

To access the elements in a simple way, you must set the id, in this case I will put one on the TextInput associated with the numerical input, you should also put a filter to accept only numerical values:

 TextInput: id: number_input text: root.col_data4 width: 300 input_filter: 'int' 

Then the test() method boils down to the following:

 class User(Screen): total_value = ObjectProperty(None) def add_more(self): self.ids.rows.add_row() def test(self): rows = self.ids.rows total = 0 for row in rows.children: text = row.ids.number_input.text total += int(text) if text != "" else 0 # validate if the entry is not empty self.total_value.text = str(total) 

In order to be able to update the values ​​automatically, we will associate the text change with the function, and in it we will call test() , in order to access the test, we must put the identifier on the screen:

 User: id: user total_value: total_value [...] 

to access the screen from App.get_running_app() :

 class Row(BoxLayout): button_text = StringProperty("") col_data3 = StringProperty("") col_data4 = StringProperty("") def __init__(self, *args, **kwargs): super(Row, self).__init__(*args, **kwargs) self.ids.number_input.bind(text=self.on_text) def on_text(self, text_input, value): App.get_running_app().root.test() 

The code:

demo.py

 from kivy.uix.screenmanager import Screen from kivy.app import App from kivy.lang import Builder from kivy.core.window import Window from kivy.uix.boxlayout import BoxLayout from kivy.properties import BooleanProperty, ListProperty, StringProperty, ObjectProperty, NumericProperty from kivy.uix.textinput import TextInput from kivy.uix.button import Button Window.clearcolor = (0.5, 0.5, 0.5, 1) Window.size = (500, 400) class User(Screen): total_value = ObjectProperty(None) def add_more(self): self.ids.rows.add_row() def test(self): rows = self.ids.rows total = 0 for row in rows.children: text = row.ids.number_input.text total += int(text) if text != "" else 0 self.total_value.text = str(total) class Row(BoxLayout): button_text = StringProperty("") col_data3 = StringProperty("") col_data4 = StringProperty("") def __init__(self, *args, **kwargs): super(Row, self).__init__(*args, **kwargs) self.ids.number_input.bind(text=self.on_text) def on_text(self, text_input, value): App.get_running_app().root.test() class Rows(BoxLayout): row_count = 0 def __init__(self, **kwargs): super(Rows, self).__init__(**kwargs) self.add_row() def add_row(self): self.row_count += 1 self.add_widget(Row(button_text=str(self.row_count))) class Test(App): def build(self): self.root = Builder.load_file('demo.kv') return self.root if __name__ == '__main__': Test().run() 

demo.kv

 <Row>: size_hint_y: None height: self.minimum_height height: 40 Button: text: root.button_text size_hint_x: None top: 200 TextInput: text: root.col_data3 width: 300 TextInput: id: number_input text: root.col_data4 width: 300 input_filter: 'int' <Rows>: size_hint_y: None height: self.minimum_height orientation: "vertical" User: id: user total_value: total_value BoxLayout: orientation: "vertical" padding : 20, 5 BoxLayout: orientation: "horizontal" #padding : 10, 10 spacing: 10, 10 size: 450, 40 size_hint: None, None Label: size_hint_x: .2 text: "Number" text_size: self.size valign: 'bottom' halign: 'center' Label: size_hint_x: .4 text: "name" text_size: self.size valign: 'bottom' halign: 'center' Label: size_hint_x: .4 text: "Value" text_size: self.size valign: 'bottom' halign: 'center' ScrollView: Rows: id: rows BoxLayout: orientation: "horizontal" padding : 10, 5 spacing: 10, 10 size: 200, 40 size_hint: None, None Label: size_hint_x: .7 text: "Total value" TextInput: id: total_value on_focus:root.test() BoxLayout: orientation: "horizontal" size_hint_x: .2 size_hint_y: .2 Button: text: "+Add More" on_press: root.add_more() 
+3
source share
  • Try:

     test = 0 for val in values: test = int(val[2])+test self.total_value.text = str(test) 
  • Try this in your .kv file:

      TextInput: id: total_value text: root.test() 

    If this does not work, you can always use Kivy Clock to periodically call your function.

+1
source share

All Articles