【问题标题】:KivyMD: How do I automatically display an MDList generated in the python fileKivyMD:如何自动显示python文件中生成的MDList
【发布时间】:2020-12-12 02:18:42
【问题描述】:

感谢您的观看。我是 Kivy/KivyMD/programming 的新手,我只是在 python 代码和 kv 代码之间没有掌握一些基本的东西。

我正在构建一个简单的应用程序,它使用 ScreenManager 在两个屏幕之间切换。 在每个屏幕上,我计划有一个动态生成的列表,其中包含来自数据库的数据。

我可以通过将静态列表和其他小部件放入 kv 文件中来添加它们。但我似乎无法理解如何在 python 文件中的类中创建/更新数据并将其链接到 kv 文件 ID。

在下面的代码中,程序可以运行,我在其中抛出了一个成功生成列表的按钮,但目标是没有按钮并在应用启动时自动生成列表。

我已经用我尝试过的东西添加了一些 cmets。我是使用了错误的变量名还是做错了什么?

[main.py python 文件]

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.list import OneLineListItem


class FirstWindow(Screen):
    print('This prints automatically when App launches')

    # But adding widgets doesn't happen automatically
    # I tried variations but the variable is always not defined
    #self.ids.list_one.add_widget(OneLineListItem(text='List Item 1'))
    #root.ids.list_one.add_widget(OneLineListItem(text='List Item 1'))
    #ids.list_one.add_widget(OneLineListItem(text='List Item 1'))

    # This function works when called from a button
    def button_push(self):
        for i in range (20):
            self.ids.list_one.add_widget(OneLineListItem(text=f'List Item {i}'))

class SecondWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class MultiscreenApp(MDApp):
    def build(self):
        return Builder.load_file('Multiscreen.kv')

if __name__ == '__main__':
    MultiscreenApp().run()

[多屏.kv文件]

WindowManager:
    FirstWindow:
        name: 'firstwindow'
    SecondWindow:
        name: 'secondwindow'


<FirstWindow>:
    BoxLayout:
        orientation: 'vertical'

        MDToolbar:
            title: 'SCREEN 1'

        Button:
            text: 'List maker button'
            on_release: root.button_push()

        ScrollView:
            MDList:
                id: list_one

        MDFloatingActionButton:
            elevation: 8
            icon: 'plus'
            pos_hint: {'center_x': .5}
            on_press:
                app.root.current = 'secondwindow'
                root.manager.transition.direction = 'left'

<SecondWindow>:
    BoxLayout:
        orientation: 'vertical'

        MDToolbar:
            title: 'SCREEN 2'

        ScrollView:
            MDList:
                id: list_two

        MDRaisedButton:
            text: 'Go Back'
            on_release:
                app.root.current = 'firstwindow'
                root.manager.transition.direction = 'right'

【问题讨论】:

    标签: python kivy kivymd


    【解决方案1】:

    您可以添加__init___ 方法和Clock.schedule_once 来触发列表创建。修改后的代码如下。我没有更改其余代码,只是添加了两个函数来显示自动创建列表。

    from kivymd.app import MDApp
    from kivy.lang import Builder
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivymd.uix.list import OneLineListItem
    from kivy.clock import Clock
    
    class FirstWindow(Screen):
        print('This prints automatically when App launches')
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            Clock.schedule_once(self.create_list)
            
        def create_list(self, *args):
            for i in range (20):
                self.ids.list_one.add_widget(OneLineListItem(text=f'List Item {i}'))
        # But adding widgets doesn't happen automatically
        # I tried variations but the variable is always not defined
        #self.ids.list_one.add_widget(OneLineListItem(text='List Item 1'))
        #root.ids.list_one.add_widget(OneLineListItem(text='List Item 1'))
        #ids.list_one.add_widget(OneLineListItem(text='List Item 1'))
    
        # This function works when called from a button
        def button_push(self):
            for i in range (20):
                self.ids.list_one.add_widget(OneLineListItem(text=f'List Item {i}'))
    
    class SecondWindow(Screen):
        pass
    
    class WindowManager(ScreenManager):
        pass
    
    class MultiscreenApp(MDApp):
        def build(self):
            return Builder.load_file('Multiscreen.kv')
    
    if __name__ == '__main__':
        MultiscreenApp().run()
    

    【讨论】:

    • 做到了。非常感谢。我对超级功能仍然很模糊。我理解继承,但这些片段还没有在我的大脑中完全点击。我会继续学习的。
    • __init__方法中需要重载的super函数以避免分段错误。
    • 如何添加每个list_item id?
    【解决方案2】:
    class FirstWindow(Screen):
        def on_enter(self, *args):
            """Event fired when the screen is displayed: the entering animation is
            complete."""
    
            def on_enter(interval):
                for i in range (20):
                    self.ids.list_one.add_widget(OneLineListItem(text=f'List Item {i}'))
    
            Clock.schedule_once(on_enter)
    

    【讨论】:

    • 谢谢。这也有效。你给了我选择,帮助我更好地理解大局。
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2021-02-21
    • 2021-05-09
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多