Mar*_*tin 8 python kivy kivy-language
我有两个文件demo.py和demo.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 调用函数?
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)
<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)
如果可以的话,这将是一个很好的帮助.
要以简单的方式访问元素,您必须设置 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)