KivyMD 滚动视图示例

KivyMD Scrollview Example

我找到了这个使用 MDlist 处理滚动视图的 kivymd 示例。 我正在努力做到这一点 运行。

我不熟悉我收到的错误代码,到目前为止我没有找到任何帮助。

这是代码:

from kivy.lang import Builder
from kivy.uix.scrollview import ScrollView
from kivymd.app import MDApp

kv =""""
<scrollview>
    ScrollView:
            do_scroll_x: False  # Important for MD compliance
            MDList:
                OneLineListItem:
                    text: "Single-line item"
                TwoLineListItem:
                    text: "Two-line item"
                    secondary_text: "Secondary text here"
                ThreeLineListItem:
                    text: "Three-line item"
                    secondary_text: "This is a multi-line label where you can fit more text than usual"
"""
class MainApp(MDApp):
    def build(self):
        self.root_widget = Builder.load_string(kv)
        sv = ScrollView()
        ml = MDList()
        sv.add_widget(ml)
        contacts = ["Paula", "John", "Kate", "Vlad"]
        for c in contacts:
            ml.add_widget(
                OneLineListItem(
                    text=c
                )
            )
        return self.root_widget

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

请帮忙!

我不明白你的 kv 字符串。首先,开头和结尾的引号应该匹配(以 4 开头,以 3 结尾)。其次,您有一个 <scrollview> 条目。我不认为这是一个合法的条目。第三,您的 kv 字符串的其余部分缩进不一致。看起来您的 kv 字符串正在尝试创建一个包含 MDListScrollView。如果可行,那么您在 build() 方法中对 ScrollView 的调用将创建这样一个包含 MDListScrollView。然后行 sv.add_widget(ml) 将尝试向 ScrollView 添加第二个 MDList (这应该会产生错误,因为 ScrollView 中只允许一个 child ).然后 build() 方法返回 self.root_widget,这与您刚刚创建的 sv 无关。

所以这里是您的代码的修改版本,它使用您在 build() 方法中创建的 sv

from kivy.uix.scrollview import ScrollView
from kivymd.app import MDApp
from kivymd.uix.list import MDList, OneLineListItem


class MainApp(MDApp):
    def build(self):
        sv = ScrollView()
        ml = MDList()
        sv.add_widget(ml)
        contacts = ["Paula", "John", "Kate", "Vlad"]
        for c in contacts:
            ml.add_widget(
                OneLineListItem(
                    text=c
                )
            )
        return sv

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

如果您向 contacts 列表中添加了足够多的姓名,滚动将起作用。

我不知道这是否有帮助。但我最近又开始使用 Kivy 开发应用程序,我有一个带有 MDList 的 ScrollView,如下所示:

<Manager>:
    Main:
        id: main
        name: 'main'

<Main>:
    BoxLayout:
        orientation: 'vertical'
        MDToolbar:
            id: toolbar
            title: "Email Assistant"
            md_bg_color: app.theme_cls.primary_dark
            elevation: 9
            left_action_items: [["help-circle-outline", lambda x: app.root.get_screen('main').open_dialog()]]
        BoxLayout:
            orientation: 'horizontal'
            columns: 3
            ScrollView:
                MDList:
                    id: container

            ScrollView:
                MDList:
                    id: container_two
                    OneLineListItem:
                        text: 'hello'
            ScrollView:
                Label:
                    id: msg
                    text: 'message'

<Main>: 是我的 python 文件中的 class,我每次加载时都使用 MDList id 输入联系人列表。

重要的旁注,我的 EmailAssistantApp 中没有我的列表 class:

class Manager(ScreenManager):
    pass

class Main(Screen):
    def on_kv_post(self, *args):
        for name, email in load_db(database_file).items():
            self.ids.container.add_widget(
                NameList(text=name, icon='account')
            )
    
    def selected(self, n):
        self.ids.name.text = n

class EmailAssistantApp(MDApp):
    def build(self):
        self.theme_cls = ThemeManager()

        return Manager()