如何将多个小部件同时添加到滚动视图?

Posted

技术标签:

【中文标题】如何将多个小部件同时添加到滚动视图?【英文标题】:How to add multiple widget at the same time to a scrollview? 【发布时间】:2020-07-27 17:34:31 【问题描述】:

我是 kivy 的新手,所以我正在开发一个测试应用程序。我想用 ScrollView 创建一个屏幕,我想在 ScrollView 中的“行”中添加多个内容、文本(描述)和图像。 我试过这种方式:

class PresentUploadedData(Screen):
    container = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(PresentUploadedData, self).__init__(**kwargs)
        Clock.schedule_once(self.setup_scrollview, 1)

    def setup_scrollview(self, dt):
        self.container.bind(minimum_height=self.container.setter('height'))
        self.add_text_inputs()

    def add_text_inputs(self):
        for x in range(30):
            self.container.add_widget(Label(text="Label ".format(x), size_hint_y=None, height=40, color= [128,0,0,1]))
            self.container.add_widget(Image(source='test.jpg', size_hint=(None, None,), width=50, height=50))

使用这个.kv 文件:

<PresentUploadedData>:
    name: "presentupload"

    message: send
    container: container

    canvas:
        Color:
            rgba: 1,1,1,1
        Rectangle:
            size: self.size
            pos: self.pos

    GridLayout:
        rows: 3
        cols: 1
        spacing: 5
        padding: 5
        font_name: "Calibri"
        background_color: 1,1,1, 1

        ScrollView:
            background_color: 1,1,1, 1
            size_hint: (1, .9)
            bar_width: 10
            bar_color: 128,0,0,0.7
            bar_inactive_color: 128,0,0,1 
            effect_cls: "ScrollEffect"
            scroll_type: ['bars', 'content']
            color: 128,0,0,1

            StackLayout:
                id: container
                size_hint_y: None
                color: 128,0,0,1

            GridLayout:
                cols: 2

        BoxLayout:
            spacing: 5
            size_hint: .7, .1

            Button:
                text: "< BACK"
                id: send
                color: 0, 0, 0, 1
                background_color: .88,.88,.88, 1
                size_hint: .2, 1
                on_release:
                    app.root.current = "main"
                    root.manager.transition.direction = "right"

但我有 ScrollView accept only one widget 异常。 为什么我得到了这个,我该如何解决这个问题?

【问题讨论】:

是的,ScrollView 只接受一个孩子,所以让那个孩子成为Layout Widget 并在Layout 中添加任何你想要的东西。 @JohnAnderson 谢谢你的想法,我按照你说的尝试了:layout = BoxLayout(orientation='vertical') layout.add_widget(Image(source='test.jpg', size_hint=(None, None,), width=50, height=50)) layout.add_widget(Label(text="Label ".format(x), size_hint_y=None, height=50, color= [128,0,0,1])) self.container.add_widget(layout) 但这让我在self.y+self.height/2 上得到了OverflowError,我什至没有在我的代码中...... 也收到了Clock.max_iteration attribute 错误 请发minimal reproducible example。 【参考方案1】:

.kvfile 中有错误: GridLayout: cols: 2 这是没用的。

可以在for 循环中再添加一个for 来解决问题:

row = [Label(text="Label ".format(x), size_hint_y=None, height=50, color= [128,0,0,1]), Image(source='test.jpg', size_hint=(None, None,), width=50, height=50)]
            for r in row:
                self.container.add_widget(r)

但这也没有把东西放在一起,只是让它们在那里。

【讨论】:

以上是关于如何将多个小部件同时添加到滚动视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将垂直滚动 TextView 添加到 Android 小部件

在 Flutter 中保持滚动视图偏移的同时添加列表视图项

Flutter 滚动视图到列上的焦点小部件

附加到多个滚动视图的 ScrollController

如何访问 Qtitan 视图的滚动条?

将应用栏滚动视图行为添加到 CoordinatorLayout 中的多个视图