KivyMD - Python - 如何在屏幕上动态添加新的小部件?
KivyMD - Python - How to add new widgets on the screen dynamicaly?
我是python的初学者,这是我的第一个应用程序,我还没有学到很多东西,所以请不要因为我的代码不聪明而评判我(我几乎把所有的东西都写在一个堆,对此感到抱歉)。
应用程序的主要思想是提醒用户进行一些活动,例如喝水,吃药,然后在日历中查看所有内容(您会在屏幕截图中看到 here and here),但起初我想做一个 "Take Medicine" 部分 - 它必须计算多少天如果 he/she 知道自己有多少颗药片以及每天必须服用多少次,则用户必须服用药片。
我创建了两个屏幕:主要用于显示对象,第二个用于创建小部件。现在我想在第二个屏幕上填充所有数据,并将带有该数据的小部件添加到主屏幕。也许我应该使用 MDCard 或列表?但我真的不知道该怎么做。
我是否应该创建数据库以在其中添加数据,然后根据该数据库在主屏幕上创建新的小部件,如果是,那么如何?以及如何动态创建和表示该小部件?也许我必须创建一个函数,以某种方式将小部件添加到主屏幕上的第二个选项卡,但是我应该在哪里以及如何实现它?
真的希望得到你的帮助,因为这是我的大学编程课程项目,但我的教授根本不想帮助学生,所以我没有其他人可以问。
所以是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.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"
与其使用 BoxLayout,不如使用 Grid Layout,它应该可以完美地解决您的问题。
这是 Kivy 文档:
https://kivy.org/doc/stable/api-kivy.uix.gridlayout.html
和一个动态创建的例子(有点难,但你可以尝试对其进行逆向工程!)
祝你好运。
我是python的初学者,这是我的第一个应用程序,我还没有学到很多东西,所以请不要因为我的代码不聪明而评判我(我几乎把所有的东西都写在一个堆,对此感到抱歉)。
应用程序的主要思想是提醒用户进行一些活动,例如喝水,吃药,然后在日历中查看所有内容(您会在屏幕截图中看到 here and here),但起初我想做一个 "Take Medicine" 部分 - 它必须计算多少天如果 he/she 知道自己有多少颗药片以及每天必须服用多少次,则用户必须服用药片。
我创建了两个屏幕:主要用于显示对象,第二个用于创建小部件。现在我想在第二个屏幕上填充所有数据,并将带有该数据的小部件添加到主屏幕。也许我应该使用 MDCard 或列表?但我真的不知道该怎么做。
我是否应该创建数据库以在其中添加数据,然后根据该数据库在主屏幕上创建新的小部件,如果是,那么如何?以及如何动态创建和表示该小部件?也许我必须创建一个函数,以某种方式将小部件添加到主屏幕上的第二个选项卡,但是我应该在哪里以及如何实现它?
真的希望得到你的帮助,因为这是我的大学编程课程项目,但我的教授根本不想帮助学生,所以我没有其他人可以问。
所以是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.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"
与其使用 BoxLayout,不如使用 Grid Layout,它应该可以完美地解决您的问题。
这是 Kivy 文档:
https://kivy.org/doc/stable/api-kivy.uix.gridlayout.html
和一个动态创建的例子(有点难,但你可以尝试对其进行逆向工程!)
祝你好运。