добавление дополнительных значений в окно kivy и получение результата в новом ярлыке в том же окне, массив Dynami c - PullRequest
0 голосов
/ 10 февраля 2020

Я новичок в Киви, и мне нужна ваша помощь. У меня небольшой вопрос:

Мне нужен массив Dynami c, в котором пользователь может ввести первое значение в первое поле TextInput, затем он может нажать кнопку «Новая строка», он получает возможность ввести второе значение в новом поле TextInput, поскольку он может нажать снова. Кнопка «Новая строка» дает ему возможность ввести третье значение в новом поле TextInput. С помощью «Result» он может вызвать сумму этих значений в метке в любое время

Как я могу создать этот динамический массив c? Большое спасибо

это мой файл 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 .. можете ли вы помогите мне?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Отвечая на вопрос, почему вы ничего не видите:

Если вы хотите автоматически загрузить свой файл kv без вызова Builder.load_file, то вам нужно убедиться, что имя вашего файла kv является именем класс вашего приложения минус часть приложения.

Например, в вашем случае ваш файл kv должен называться mymain.kv, а не main.kv

, чтобы загрузить файл kv вручную, пожалуйста, используйте builder

Builder.load_file('main.kv')

Пожалуйста, смотрите https://kivy.org/doc/stable/guide/lang.html для получения дополнительной помощи.

После этого ответа NoEmbryos вам придется пройти остаток пути. Надеюсь, это поможет!

0 голосов
/ 10 февраля 2020

В вашем коде есть некоторые неправильные вещи, но вам нужно выполнить следующее:

  • Сначала измените виджет root WindowManager: на правило <WindowManager>: и
  • Во-вторых, добавьте вещи после завершения инициализации виджета, используя 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()

enter image description here

...