Python 在kivy窗口中添加更多值,并在同一窗口中的新标签dynamic array中获得结果
我是Kivy的新手,需要你的帮助。我有一个小问题: 我需要一个动态数组,用户可以在第一个文本输入字段中输入第一个值,然后他可以按“新行”按钮,他有机会在新文本输入字段中输入第二个值,因为他可以再次按“新行”按钮,他可以在新文本输入字段中输入第三个值。通过“结果”,他可以随时调用标签中这些值的总和 如何创建此动态数组?多谢各位 这是我的main.py文件Python 在kivy窗口中添加更多值,并在同一窗口中的新标签dynamic array中获得结果,python,arrays,dynamic,kivy,screen,Python,Arrays,Dynamic,Kivy,Screen,我是Kivy的新手,需要你的帮助。我有一个小问题: 我需要一个动态数组,用户可以在第一个文本输入字段中输入第一个值,然后他可以按“新行”按钮,他有机会在新文本输入字段中输入第二个值,因为他可以再次按“新行”按钮,他可以在新文本输入字段中输入第三个值。通过“结果”,他可以随时调用标签中这些值的总和 如何创建此动态数组?多谢各位 这是我的main.py文件 from kivy.clock import Clock from kivy.uix.textinput import TextInput fr
from kivy.clock import Clock
from kivy.uix.textinput import TextInput
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
Builder.load_file('MyMain.kv')
class WindowManager(ScreenManager):
pass
class MainWindow(Screen):
def __init__(self, **kwargs):
super(MainWindow, self).__init__(**kwargs)
self.counter = 1
Clock.schedule_once(self.add_stuff)
def add_stuff(self, *args):
self.textlist = [TextInput()]
self.ids.grid.add_widget(Label(text='Input value {}'.format(self.counter)))
self.counter += 1
self.ids.grid.add_widget(self.textlist[0])
# function to create new inputs, that button 'new line' calls:
def addnewtextinput(self):
self.ids.grid.add_widget(Label(text='Input value ' + str(self.counter)))
self.counter += 1
self.textlist.append(TextInput())
self.ids.grid.add_widget(self.textlist[-1])
# function to get a result:
def getresult(self):
result = 0
for i in self.textlist:
# you may convert it to float if you need, like float(i.text)
result += int(i.text)
self.ids.label_id.text = str(result)
class MyMainApp(App):
def build(self):
b1=WindowManager()
MainWindow()
return b1
if __name__ == "__main__":
MyMainApp().run()
这是MyMain.kv
<CustButton@Button>:
font_size: 40
<WindowManager>:
MainWindow:
<MainWindow>:
name: "main"
# don't forget to add this
grid: grid.__self__
GridLayout:
cols:1
# you will control that GridLayout from .py so here it's empty
GridLayout:
# set the id to be able to control it from .py file
id: grid
cols: 2
CustButton:
text: "new line"
on_press: root.addnewtextinput()
CustButton:
text: "result"
font_size: "30sp"
on_press: root.getresult()
TextInput:
id:label_id
font_size: 40
multiline: True
:
字体大小:40
:
主窗口:
:
名称:“主要”
#别忘了加上这个
网格:网格__
网格布局:
科尔斯:1
#您将从.py控制GridLayout,所以这里它是空的
网格布局:
#将id设置为能够从.py文件控制它
id:网格
科尔斯:2
按钮:
正文:“新行”
on_press:root.addNewtPut()
按钮:
正文:“结果”
字体大小:“30sp”
按以下键:root.getresult()
文本输入:
id:label\u id
字体大小:40
多行:正确
我看不见kivy的窗户。。您能帮助我吗?您的代码中有一些错误的地方,但要运行它,您需要做的是:
- 首先,将根小部件
更改为规则WindowManager:
,然后:
- 其次,在小部件完成初始化后,使用
添加内容Clock.schedule\u once(self.add\u stuff)
.py
应如下所示:
类窗口管理器(屏幕管理器):
通过
类主窗口(屏幕):
定义初始(自我,**kwargs):
超级(主窗口,自我)。\uuuuu初始化(**kwargs)
self.counter=1
时钟。计划一次(自我添加)
def add_stuff(self,*args):
self.textlist=[TextInput()]
self.ids.grid.add_小部件(标签(text='Input value{}'。格式(self.counter)))
self.counter+=1
self.ids.grid.add_小部件(self.textlist[0])
#函数创建新输入,按钮“新行”调用:
def添加输出(自身):
self.ids.grid.add_小部件(标签(text='Input value'+str(self.counter)))
self.counter+=1
self.textlist.append(TextInput())
self.ids.grid.add_小部件(self.textlist[-1])
#函数以获取结果:
def getresult(self):
结果=0
对于self.textlist中的i:
#如果需要,可以将其转换为float,比如float(i.text)
结果+=int(i.text)
self.ids.label\u id.text=str(结果)
类MyMainApp(应用程序):
def生成(自):
b1=WindowManager()
主窗口()
返回b1
如果名称=“\uuuuu main\uuuuuuuu”:
MyMainApp().run()
回答为什么你什么都看不见: 如果要在不调用Builder.load_file的情况下自动加载kv文件,则需要确保kv文件的名称是应用程序类的名称减去应用程序部分 例如,在您的情况下,您的kv文件应该命名为mymain.kv而不是main.kv 要手动加载kv文件,请使用builder
Builder.load_file('main.kv')
请查看以获得更多帮助
在这之后,答案应该会让你走完剩下的路。
希望有帮助 你好,noEmbryo谢谢你的回答,我不太明白你的句子“当小部件使用Clock.schedule\u完成初始化时添加东西一次(self.add\u stuff)。”我应该将它添加到.kv文件中吗?@jan在我的回答中重新表述了它。我的意思是,您必须首先让小部件完成其初始化(运行
init
方法),然后向其添加一些小部件。当你安排某事时,它会在第一个可用的时刻执行(在init
之后)。修复的.py
包含此调用。问题是我无法到达.KV文件,形成文件。py模块“Builder”未激活,我有以下错误:“第20行,在add_stuff self.ids.grid.add_小部件(Label(text='Input value{}.format(self.counter)))文件“kivy\properties.pyx“,第863行,kivy.properties.observedict.\uuu getattr\uuuuu”AttributeError:“super”对象没有属性“getattr”@jan很高兴听到这个消息。所以你可以…我必须对任务做一些小的更改:相反,用户必须在第一个文本输入“第一个输入值”和点中写入不同的值。”。“在每个值之间,例如9.2如果他按Enter键,您可以创建一个新框,“第二个输入值”,然后他可以继续在第二个框中写入值,例如1,他可以按“结果”,他可以在两个不同标签中获得总和第一个框“9”中的第一个值加上第二个框“1”中的第一个值第二个框“2”中的第二个值”加上第二个框“0”中的第二个值如何在框中创建此动态数组?谢谢