Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to plus integer value in loop

I have two file demo.py and demo.kv.can someone help me?

1. +Add More add row dynamic.After fill value when i click on Total Value then it shows string like 151012.Don't show 12+10+15=37.I am using code for it

        test = ''
        for val in values:
            test = val[2]+test

        self.total_value.text = test

2. Can anyone tell me how to put sum of value in Total value TextBox after fill value TextBox instead of click on Total Value Box.Means How to call def test(self) function from 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()

it would be a great assistance if you could.

like image 606
Nirdesh Kumawat Avatar asked Jan 12 '18 10:01

Nirdesh Kumawat


People also ask

How do you add integers to a loop?

You add by using the += operator: for (i = 1; i <= n; i++) total += i; cout << total; Note this is short for total = total + i .

Can you use for loop with integers?

One of the most common uses of for-loops in Python is to iterate over an interval of integers.


1 Answers

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

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

Then the method test() is reduced 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)

To be able to update the values automatically we will link the text change to a function, and in it we will call test(), in order to access the test we must place an id to Screen:

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

to be able to access 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()

Complete 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()
like image 118
eyllanesc Avatar answered Sep 30 '22 00:09

eyllanesc