【问题标题】:Dynamic widgets on GridLayout with ScrollView带有 ScrollView 的 GridLayout 上的动态小部件
【发布时间】:2019-05-23 23:19:47
【问题描述】:

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

我在下面的代码中复制了核心部分。我曾尝试使用回收视图,但未能成功。因此,现在我正在尝试解决的算法是 -

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

  • 当 Grid 行达到 '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()

或者如果有更好的方法来实现我正在寻找的东西,请提出建议。提前感谢您的支持。

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    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())
    

    输出

    【讨论】:

    • 现在这给我上了一个很好的新课。感谢 ikolim 的及时回复。
    【解决方案2】:

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

    唯一可行的解​​决方案是让 RecycleView 工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 2022-08-13
      相关资源
      最近更新 更多