带有ScrollView的GridLayout上的动态小部件

时间:2019-05-19 21:28:57

标签: python kivy

类似的帖子实际上无法帮助我。因此发布我自己的场景。我在其他布局中有一个网格布局区域。现在,该网格的行数是动态的。这是一个数据表。每次用户按下“添加”按钮时,都需要添加新行。并且当列表增长到大于布局大小时,滚动条应出现。

我在以下代码中复制了核心部分。我尝试使用回收视图,但无法成功。因此,现在我要尝试的算法是-

  • 当按下添加按钮时,将调用python函数,该函数将收集接下来4个单元格的数据,并在网格布局中再添加4个按钮。

  • 当网格行达到“ x”值上方时,将显示滚动条。

mydatatable.py

import os
os.environ['KIVY_GL_BACKEND'] = 'gl'
import kivy
kivy.require('1.11.0')

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.properties import NumericProperty

class DataTable(BoxLayout):
    pass


class MyTableApp(App):

    rowNumber = NumericProperty(2)

    def build(self):
        return DataTable()

    def add_a_row(self):
        self.rowNumber += 1    


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

mytable.kv

<DataTable>:
    orientation : 'vertical'

    Button:
        text : ""
    #---------------------------------- 
    BoxLayout:
        orientation : 'horizontal'

        Button:
            text : ""
        #---------------------------------- 
        BoxLayout:
            orientation : 'vertical'

            GridLayout:
                cols : 4
                size_hint: 1.0, app.rowNumber*0.15

                Button:
                    text: "name"
                    size_hint: 1, app.rowNumber 
                Button:
                    text: "type"
                    size_hint: 1, app.rowNumber 
                Button:
                    text: "content"
                    size_hint: 1, app.rowNumber 
                Button:
                    text: "xyz"
                    size_hint: 1, app.rowNumber 

                Button:
                    text: "name"
                    size_hint: 1, app.rowNumber 
                Button:
                    text: "type"
                    size_hint: 1, app.rowNumber 
                Button:
                    text: "content"
                    size_hint: 1, app.rowNumber 
                Button:
                    text: "xyz"
                    size_hint: 1, app.rowNumber     

            Label:
                size_hint: 1.0, (1.0 - (app.rowNumber-1)*0.15)
        #----------------------------------         
        Button:
            text : ""
    #---------------------------------- 
    Button: 
        text: "Add"
        on_release:
            app.add_a_row()

或者,如果有更好的方法来实现我的期望,请提出建议。谢谢您的提前支持。

2 个答案:

答案 0 :(得分:0)

我仍在努力阐明这一点。我找不到像添加尚未在初始设计文件中声明的新小部件之类的东西。我有一种感觉,kivy没有这样的选择。

只有可行的解决方案才能使RecycleView正常工作。

答案 1 :(得分:0)

Kivy ScrollView和GridLayout

以下解决方案使用ScrollViewGridLayout解决问题。

  • BoxLayout替换为ScrollView以支持滚动
  • id: container添加到实例化对象GirdLayout:
  • 确保GridLayout的高度足以滚动
  • 为每行设置默认高度
  • 连续添加一个类

摘要-kv文件

<Row>:
    orientation: "horizontal"

    Button:
        text: "name"
    Button:
        text: "type"
    Button:
        text: "content"
    Button:
        text: "xyz"

...

<DataTable>:

        ScrollView:

            GridLayout:
                id: container
                cols: 1
                size_hint_y: None
                height: self.minimum_height
                row_force_default: True
                row_default_height: dp(26)

摘要-Py文件

class Row(BoxLayout):
    pass

...

class TestApp(App):

    ...

    def add_a_row(self):
        self.root.ids.container.add_widget(Row())

输出

Result