KivyMD - Python - Как динамически добавлять новые виджеты на экран? - PullRequest
0 голосов
/ 08 мая 2020

Я очень новичок в python, и это мое первое приложение, и я еще многому не научился, поэтому, пожалуйста, не судите меня за неумный код (я пишу почти все в одной куче, извините за который).

Основная идея приложения заключалась в том, чтобы напоминать пользователю о некоторых действиях, например, пить воду, принимать лекарство и видеть все это в календаре (вы увидите это на скриншотах здесь и здесь ), но сначала я хочу сделать часть «Примите лекарство» - она ​​должна рассчитать, сколько дней пользователь должен принимать таблетки, если он / она знает, сколько таблеток у него есть и сколько раз в день они должны их использовать.

Я создал два экрана: главный для отображения объектов и второй для создания этих виджетов. Теперь я хочу заполнить все данные на втором экране и добавить виджет с этими данными на главный экран. Может мне стоит использовать MDCards или списки? Но я понятия не имею, как все это делать.

Следует ли мне создавать базу данных для добавления туда данных, а затем создавать новые виджеты на главном экране в соответствии с этим, и если да, то как? А как динамически создавать и представлять эти виджеты? Может быть, мне нужно создать функцию, которая каким-то образом добавит виджеты на вторую вкладку на главном экране, но где и как я могу это реализовать?

Очень надеюсь на вашу помощь, потому что это мой проект для университетского курса программирования, но мой профессор совсем не хочет помогать студентам, поэтому мне больше не о чем спрашивать.

Так что это main.py

from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.app import MDApp

class ScreensManager(ScreenManager):
    pass

class MainScreen(Screen):
    pass

class SecondScreen(Screen):
    pass


class MyApp(MDApp):
    def __init__(self, **kwargs):
        self.title = "Do Not Forget"
        self.theme_cls.primary_palette = "Teal"
        Window.size = (1080 / 3.4, 2280 / 3.4)
        super().__init__(**kwargs)

    def build(self):
        return ScreensManager() 

if __name__ == "__main__":
    MyApp().run()

И my. кв

<ScreensManager>:
    MainScreen:
    SecondScreen:

<MainScreen>:
    name: "main_screen"

    BoxLayout:
        orientation: 'vertical'

        MDBottomNavigation:
            MDBottomNavigationItem:
                name: 'screen1'
                text: 'active'
                icon: 'note-plus'

                MDFloatingActionButton:
                    pos_hint:{"center_x": .85, "center_y": .075}
                    icon: 'plus'
                    md_bg_color: app.theme_cls.primary_color

                    #this is uncompleted part, doesn't matter for now
                    #on_release:
                    #   app.root.current = "third_screen"
                    #   root.manager.transition.direction = "left"


            MDBottomNavigationItem:
                name: 'screen2'
                text: 'medicine'
                icon: 'pill'

                MDFloatingActionButton:
                    pos_hint:{"center_x": .85, "center_y": .075}
                    icon: 'plus'
                    md_bg_color: app.theme_cls.primary_color
                    on_release:
                        app.root.current = "second_screen"
                        root.manager.transition.direction = "left"

            MDBottomNavigationItem:
                name: 'screen3'
                text: 'calendar'
                icon: 'calendar'


<SecondScreen>:
    name: "second_screen"

    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            padding: 20

            MDLabel:
                text: "Insert your data"

            Widget:

            MDLabel:
                text:"Name of medicine"

            MDTextField:
                id: name_med
                hint_text: "Name"
                mode: "rectangle"

            Widget:

            MDLabel:
                text:"How many pills do you have?"

            MDTextField:
                id: pills_amount
                hint_text: "Pills amount"
                mode: "rectangle"

            Widget:

            MDLabel:
                text:"How many times a day to take them?"

            MDTextField:
                id: times_amount
                hint_text: "Times a day"
                mode: "rectangle"

        FloatLayout:
            MDFloatingActionButton:
                pos_hint:{"center_x": .2, "center_y": .2}
                icon: 'arrow-left'
                on_release:
                    app.root.current = "main_screen"
                    root.manager.transition.direction = "right"

            MDFloatingActionButton:
                pos_hint:{"center_x": .8, "center_y": .2}
                icon: 'check'
                md_bg_color: app.theme_cls.primary_color
                on_release:
                    app.root.current = "main_screen"
                    root.manager.transition.direction = "right"

1 Ответ

0 голосов
/ 09 мая 2020

Вместо использования BoxLayout вы должны использовать Grid Layout, который должен полностью ответить на вашу проблему c.

Вот что Kivy do c об этом:

https://kivy.org/doc/stable/api-kivy.uix.gridlayout.html

и пример создания Dynami c (немного сложно, но вы можете попробовать его обратное проектирование!)

Dynami c grid в Kivy с каждым элементом сетки, содержащим несколько виджетов

Удачи.

...