Python/Kivy:如何在循环中加上整数值

Mar*_*tin 8 python kivy kivy-language

我有两个文件demo.pydemo.kv.can有人帮助我吗?

1.+Add More添加行动态.当我点击时填充值Total Value后,它显示字符串,如.151012不显示12+10+15=37.我正在使用代码

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

        self.total_value.text = test
Run Code Online (Sandbox Code Playgroud)

2.任何人都可以告诉我如何Total value在填充valueTextBox 之后在TextBox中放置值的总和而不是单击Total ValueBox.Means如何def test(self)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()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

如果可以的话,这将是一个很好的帮助.

eyl*_*esc 3

要以简单的方式访问元素,您必须设置 id,在本例中,我将设置 id 为TextInput与数字输入关联的 id,您还必须放置一个过滤器以仅接受数字值:

TextInput:
    id: number_input
    text: root.col_data4
    width: 300
    input_filter: 'int'
Run Code Online (Sandbox Code Playgroud)

那么该方法test()就简化为以下:

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)
Run Code Online (Sandbox Code Playgroud)

为了能够自动更新值,我们将文本更改链接到一个函数,并在其中调用test(),为了访问测试,我们必须将 id 放置到 Screen:

User:
    id: user
    total_value: total_value
    [...]
Run Code Online (Sandbox Code Playgroud)

能够从以下位置访问屏幕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()
Run Code Online (Sandbox Code Playgroud)

完整代码:

演示.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()
Run Code Online (Sandbox Code Playgroud)

演示.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()
Run Code Online (Sandbox Code Playgroud)