Python 如何将多个列放入kivy RecycleView?

Python 如何将多个列放入kivy RecycleView?,python,kivy,kivy-language,Python,Kivy,Kivy Language,我想将(csv-)表的数据放入kivy recycleview 如果我给kv中的标签指定了一个固定文本,我就设法用一行插入多个列,但我无法让它用字典列表中的数据填充标签。这是迄今为止我用来测试概念的代码: 从kivy.app导入应用 从kivy.lang导入生成器 从kivy.uix.recycleview导入recycleview 从kivy.uix.boxlayout导入boxlayout 导入csv items=[{'SP1':'ArtikerNummer','SP2':'Name','S

我想将(csv-)表的数据放入kivy recycleview

如果我给kv中的标签指定了一个固定文本,我就设法用一行插入多个列,但我无法让它用字典列表中的数据填充标签。这是迄今为止我用来测试概念的代码:

从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.recycleview导入recycleview
从kivy.uix.boxlayout导入boxlayout
导入csv
items=[{'SP1':'ArtikerNummer','SP2':'Name','SP3':'Groesse'},
{'SP1':'510001','SP2':'Big Pump','SP3':'1.50 L'},
{'SP1':'523001','SP2':'Leonie Still','SP3':'1.50 L'},
{'SP1':'641301','SP2':'ColaMix','SP3':'1.50L'}
]
类选项卡(框布局):
定义初始(自我,**kwargs):
超级(Tabelle,self)。\uuuuu初始值(**kwargs)
def insert_SP(自身,数据):
对于数据中的i:
self.spalte1_SP=i['SP1']
#打印(自选垃圾邮件1\u SP)
self.spalte2_SP=i['SP2']
self.spalte3_SP=i['SP3']
Builder.load_字符串(“”)
:
方向:“水平”
spalte1_SP:“spalte1”
spalte2_SP:“spalte2”
spalte3_SP:“spalte3”
标签:
id:Spalte1
文本:root.spalte1\u SP
标签:
id:Spalte2
文本:root.spalte2\u SP
标签:
id:Spalte3
文本:root.spalte3\u SP
:
viewclass:“Tabelle”
循环利用布局:
默认大小:无,dp(20)
默认大小提示:1,无
尺寸提示:无
高度:自身最小高度
方向:“垂直”
''')
RV级(回收利用审查):
定义初始(自我,**kwargs):
超级(RV,自我)。\uuuuu初始值(**kwargs)
#self.data=[]
x=Tabelle()
x、 插入SP(项目)
类TestApp(应用程序):
def生成(自):
返回RV()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()

我希望在3列中看到项中的数据,但由于某些原因,它们保持为空。

它是空的,因为未填充
数据

解决方案
  • 删除
    类选项卡()中的所有编码
  • pass
    添加到
    class选项卡()
  • 将以下内容添加到
    类RV()
片段 视图是通过处理生成的,本质上是一个列表 ,并使用这些dict生成viewclass的实例 根据需要

data
当前视图适配器使用的数据。这是一个目录 其键映射到viewclass的相应属性名称

数据是一个别名属性,用于获取和设置用于生成 这些观点

例子 main.py
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.recycleview导入recycleview
从kivy.uix.boxlayout导入boxlayout
items=[{'SP1':'ArtikerNummer','SP2':'Name','SP3':'Groesse'},
{'SP1':'510001','SP2':'Big Pump','SP3':'1.50 L'},
{'SP1':'523001','SP2':'Leonie Still','SP3':'1.50 L'},
{'SP1':'641301','SP2':'ColaMix','SP3':'1.50L'}
]
类选项卡(框布局):
通过
Builder.load_字符串(“”)
:
方向:“水平”
spalte1_SP:“spalte1”
spalte2_SP:“spalte2”
spalte3_SP:“spalte3”
标签:
id:SP1
文本:root.spalte1\u SP
标签:
id:SP2
文本:root.spalte2\u SP
标签:
编号:SP3
文本:root.spalte3\u SP
:
viewclass:“Tabelle”
循环利用布局:
默认大小:无,dp(20)
默认大小提示:1,无
尺寸提示:无
高度:自身最小高度
方向:“垂直”
''')
RV级(回收利用审查):
定义初始(自我,**kwargs):
超级(RV,自我)。\uuuuu初始值(**kwargs)
self.data=[{'spalte1_SP':str(x['SP1']),'spalte2_SP':str(x['SP2']),'spalte3_SP':str(x['SP3'])表示项目中的x]
类TestApp(应用程序):
def生成(自):
返回RV()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
输出

我说不出话来。在花了一整天的时间讨论这个问题,并看到解决方案实际上看起来是多么简单之后。。。你简直不敢相信这对我有多大帮助!非常感谢。不客气!另一种解决方案是使用
viewclass:'Label'
RecycleGridLayout:
cols:3
,和
self.data=[{'text':val}作为行中项目的行,用于行中的val.values()]
。谢谢,当我想添加更多列时,它看起来更通用。肯定会测试出来的。
data
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.boxlayout import BoxLayout

items = [{'SP1': 'Artikelnummer', 'SP2': 'Name', 'SP3': 'Groesse'},
         {'SP1': '510001', 'SP2': 'Big Pump', 'SP3': '1.50 L'},
         {'SP1': '523001', 'SP2': 'Leonie Still', 'SP3': '1.50 L'},
         {'SP1': '641301', 'SP2': 'Cola Mix', 'SP3': '1.50 L'}
         ]


class Tabelle(BoxLayout):
    pass


Builder.load_string('''
<Tabelle>:
    orientation: 'horizontal'
    spalte1_SP: 'spalte1'
    spalte2_SP: 'spalte2'
    spalte3_SP: 'spalte3'
    Label:
        id: SP1
        text: root.spalte1_SP
    Label:
        id: SP2
        text: root.spalte2_SP
    Label:
        id: SP3
        text: root.spalte3_SP

<RV>:
    viewclass: 'Tabelle'
    RecycleBoxLayout:
        default_size: None, dp(20)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'
''')


class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'spalte1_SP': str(x['SP1']), 'spalte2_SP': str(x['SP2']), 'spalte3_SP': str(x['SP3'])} for x in items]


class TestApp(App):
    def build(self):
        return RV()


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