【问题标题】:adding more Values in kivy window and getting the result in new Label in the same Window , dynamic array在 kivy 窗口中添加更多值并在同一窗口中的新标签中获取结果,动态数组
【发布时间】:2020-05-26 00:32:28
【问题描述】:

我是 Kivy 的新手,需要您的帮助。我有一个小问题:

我需要一个动态数组,用户可以在第一个 TextInput 字段中输入第一个值,然后他可以按“换行”按钮,他有机会在新的 TextInput 字段中输入第二个值他可以再次按下“新行”按钮,他可以选择在新的 TextInput 字段中输入第三个值。使用“结果”,他可以随时在标签中调用这些值的总和

如何创建这个动态数组?非常感谢

这是我的 main.py 文件

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

我看不到 kivy Window .. 你能帮帮我吗?

【问题讨论】:

    标签: python arrays dynamic kivy screen


    【解决方案1】:

    你的代码中有一些错误的地方,但你需要做的是:

    • 首先,将根小部件WindowManager: 更改为规则&lt;WindowManager&gt;:
    • 其次,在小部件完成初始化后添加内容,使用Clock.schedule_once(self.add_stuff)

    .py 应如下所示:

    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()
    

    【讨论】:

    • 您好 noEmbryo 感谢您的回答,我不太明白您的句子“使用 Clock.schedule_once(self.add_stuff) 在小部件完成初始化时添加内容。”我应该将它添加到 . kv 文件?
    • @jan 在我的回答中改写了它。我的意思是,你必须首先让一个小部件完成它的初始化(运行init 方法),然后向它添加一些小部件。当您安排某些事情时,它会在第一个可用时刻(init 之后)执行。固定的.py 包含此调用。
    • 问题我无法到达 .KV 文件,形成文件 .py 模块“Builder”未激活,我有这个错误:“第 20 行,在 add_stuff self.ids .grid.add_widget(Label(text='Input value {}'.format(self.counter))) 文件“kivy\properties.pyx”,第 863 行,在 kivy.properties.ObservableDict.__getattr__ AttributeError: 'super' object没有属性 'getattr'"
    • @jan 很高兴听到它。所以你可以accept my answer...
    • 我必须对任务做些小改动:取而代之的是,用户必须在第一个文本输入“第一个输入值”和点“中写入不同的值。”每个值之间,例如9.2 如果他按 Enter 键,您可以创建一个新框,“第二个输入值”,然后他可以继续在第二个框中写入值,例如 1 然后他可以按“结果”,他得到总和2 个不同的标签 第一个框“9”中的第一个值加上第二个框“1”中的第一个值 第一个框“2”中的第二个值加上第二个框“0”中的第二个值我如何在盒子 ?谢谢
    【解决方案2】:

    回答为什么你什么都看不到:

    如果您想在不调用 Builder.load_file 的情况下自动加载您的 kv 文件,那么您需要确保您的 kv 文件的名称是您的 App 类的名称减去 App 部分。

    例如,在您的情况下,您的 kv 文件应命名为 mymain.kv 而不是 main.kv

    要手动加载kv文件,请使用builder

    Builder.load_file('main.kv')
    

    请参阅https://kivy.org/doc/stable/guide/lang.html 以获得更多帮助。

    在这个 NoEmbryos 回答之后,你应该可以完成剩下的工作。 希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2019-05-15
      相关资源
      最近更新 更多