【问题标题】:KivyMD - Python - How to add new widgets on the screen dynamicaly?KivyMD - Python - 如何在屏幕上动态添加新的小部件?
【发布时间】:2020-08-24 12:34:33
【问题描述】:

我是python的初学者,这是我的第一个应用程序,我还没有学到很多东西,所以请不要因为我的代码不聪明而评判我(我几乎全部写在一个堆中,对此感到抱歉) .

应用程序的主要思想是提醒用户做一些活动,例如喝水,吃药,在日历上看到这一切(你会在截图herehere看到),但一开始我想做一个“吃药”的部分——它必须计算多少天如果他/她知道他们有多少药片以及每天必须服用多少次,则用户必须服用药片。

我创建了两个屏幕:主屏幕用于显示对象,第二屏幕用于创建小部件。现在我想填充第二个屏幕上的所有数据,并将带有该数据的小部件添加到主屏幕。也许我应该使用 MDCards 或 Lists?但我真的不知道该怎么做。

我是否应该创建数据库以在其中添加数据,然后根据此在主屏幕上创建新的小部件,如果是,那么如何?以及如何动态地创建和表示这些小部件?也许我必须创建一个函数,以某种方式将小部件添加到主屏幕上的第二个选项卡,但我应该在哪里以及如何实现它?

真的希望得到您的帮助,因为这是我的大学编程课程项目,但我的教授根本不想帮助学生,所以我没有其他人可以问。

所以它是 ma​​in.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.kv

<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"

【问题讨论】:

    标签: python dynamic widget kivy screen


    【解决方案1】:

    您应该使用网格布局,而不是使用 BoxLayout,它应该可以完美地解决您的问题。

    这是 Kivy 文档:

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

    还有一个动态创建的例子(有点难,但你可以尝试对其进行逆向工程!)

    Dynamic grid in Kivy with each grid element containing multiple widgets

    祝你好运。

    【讨论】:

    • 感谢您提供的信息,它有帮助,但主要问题不在此。按下按钮后,我不知道如何创建新的小部件。最近,我尝试在一个位于该 GridLayout 内部的新类中执行功能,但是当我按下该按钮时没有创建任何内容,我不知道为什么
    • 它是否回答了您的第二个问题:stackoverflow.com/questions/28577828/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多