Python Kivy Recycleview从按钮查看更新,但不从应用程序构建方法查看更新

Python Kivy Recycleview从按钮查看更新,但不从应用程序构建方法查看更新,python,kivy,Python,Kivy,一个示例Kivy应用程序在点击按钮后填充Recycleview。 但是,当我将类函数中的代码复制到App.build以在应用程序加载时填充Recycleview时,它不会这样做。它是否未正确引用Recycleview?为什么这不起作用 我在这里看到了一些使用“self.ids.”查找Recycleview数据的答案,还有“App.get_running_App()”,但它不起作用 (注意:需要Kivy 2.0.0rc4才能编译) 来自随机导入样本,randint 从字符串导入ascii_小写 从

一个示例Kivy应用程序在点击按钮后填充Recycleview。 但是,当我将类函数中的代码复制到App.build以在应用程序加载时填充Recycleview时,它不会这样做。它是否未正确引用Recycleview?为什么这不起作用

我在这里看到了一些使用“self.ids.”查找Recycleview数据的答案,还有“App.get_running_App()”,但它不起作用

(注意:需要Kivy 2.0.0rc4才能编译)

来自随机导入样本,randint
从字符串导入ascii_小写
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.boxlayout导入boxlayout
kv=”“”
:
在以下情况之前:
颜色:
rgba:0.5,0.5,0.5,1
矩形:
大小:self.size
pos:self.pos
值:“”
标签:
id:姓名
标签:
文本:root.value
:
画布:
颜色:
rgba:0.3,0.3,0.3,1
矩形:
大小:self.size
pos:self.pos
房车:房车
方向:“垂直”
网格布局:
科尔斯:3
行数:2
尺寸提示:无
高度:dp(108)
填充:dp(8)
间距:dp(16)
按钮:
文本:“填充列表”
按以下键:root.populate()
按钮:
文本:“排序列表”
按:root.sort()
按钮:
文本:“清除列表”
按:root.clear()
盒子布局:
间距:dp(8)
按钮:
文本:“插入新项目”
按:root.insert(新项目输入文本)
文本输入:
id:新项目输入
大小提示:0.6
提示文字:“值”
填充:dp(10),dp(10),0,0
盒子布局:
间距:dp(8)
按钮:
文本:“更新第一项”
按:root.update(更新项目输入文本)
文本输入:
id:更新项目输入
大小提示:0.6
提示文字:“新值”
填充:dp(10),dp(10),0,0
按钮:
文本:“删除第一项”
按:root.remove()
回收审查:
id:rv
滚动类型:['bar','content']
滚轮距离:dp(114)
钢筋宽度:dp(10)
viewclass:“行”
循环利用布局:
默认大小:无,dp(56)
默认大小提示:1,无
尺寸提示:无
高度:自身最小高度
方向:“垂直”
间距:dp(2)
"""
建筑商荷载(千伏)
类别测试(BoxLayout):
def填充(自我):
self.rv.data=[
{'name.text':''.join(示例(ascii_小写,6)),
“值”:str(randint(02000))}
对于范围内的x(50)]
def分拣(自我):
self.rv.data=sorted(self.rv.data,key=lambda x:x['name.text']))
def清除(自):
self.rv.data=[]
def插入(自身,值):
自rv数据插入(0{
'name.text':值或'default value','value':'unknown'})
def更新(自身、值):
如果是自相关数据:
self.rv.data[0]['name.text']=值或“默认新值”
self.rv.refresh_from_data()
def移除(自):
如果是自相关数据:
自身rv数据pop(0)
类TestApp(应用程序):
def生成(自):
t=测试()
t、 rv.data=[
{'name.text':''.join(示例(ascii_小写,6)),
“值”:str(randint(02000))}
对于范围内的x(50)]
t、 rv.从_数据()刷新_
返回测试()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()

一种解决方案是从测试类执行Recycleview更新

from random import sample, randint
from string import ascii_lowercase


from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout


kv = """
<Row@RecycleKVIDsDataViewBehavior+BoxLayout>:
    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 1
        Rectangle:
            size: self.size
            pos: self.pos
    value: ''
    Label:
        id: name
    Label:
        text: root.value

<Test>:
    canvas:
        Color:
            rgba: 0.3, 0.3, 0.3, 1
        Rectangle:
            size: self.size
            pos: self.pos
    rv: rv
    orientation: 'vertical'
    GridLayout:
        cols: 3
        rows: 2
        size_hint_y: None
        height: dp(108)
        padding: dp(8)
        spacing: dp(16)
        Button:
            text: 'Populate list'
            on_press: root.populate()
        Button:
            text: 'Sort list'
            on_press: root.sort()
        Button:
            text: 'Clear list'
            on_press: root.clear()
        BoxLayout:
            spacing: dp(8)
            Button:
                text: 'Insert new item'
                on_press: root.insert(new_item_input.text)
            TextInput:
                id: new_item_input
                size_hint_x: 0.6
                hint_text: 'value'
                padding: dp(10), dp(10), 0, 0
        BoxLayout:
            spacing: dp(8)
            Button:
                text: 'Update first item'
                on_press: root.update(update_item_input.text)
            TextInput:
                id: update_item_input
                size_hint_x: 0.6
                hint_text: 'new value'
                padding: dp(10), dp(10), 0, 0
        Button:
            text: 'Remove first item'
            on_press: root.remove()

    RecycleView:
        id: rv
        scroll_type: ['bars', 'content']
        scroll_wheel_distance: dp(114)
        bar_width: dp(10)
        viewclass: 'Row'
        RecycleBoxLayout:
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'
            spacing: dp(2)
"""

Builder.load_string(kv)


class Test(BoxLayout):

    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.populate()

    def populate(self):
        self.rv.data = [
            {'name.text': ''.join(sample(ascii_lowercase, 6)),
             'value': str(randint(0, 2000))}
            for x in range(50)]


    def sort(self):
        self.rv.data = sorted(self.rv.data, key=lambda x: x['name.text'])

    def clear(self):
        self.rv.data = []

    def insert(self, value):
        self.rv.data.insert(0, {
            'name.text': value or 'default value', 'value': 'unknown'})

    def update(self, value):
        if self.rv.data:
            self.rv.data[0]['name.text'] = value or 'default new value'
            self.rv.refresh_from_data()

    def remove(self):
        if self.rv.data:
            self.rv.data.pop(0)


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


if __name__ == '__main__':
    TestApp().run()
来自随机导入样本,randint
从字符串导入ascii_小写
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.boxlayout导入boxlayout
kv=”“”
:
在以下情况之前:
颜色:
rgba:0.5,0.5,0.5,1
矩形:
大小:self.size
pos:self.pos
值:“”
标签:
id:姓名
标签:
文本:root.value
:
画布:
颜色:
rgba:0.3,0.3,0.3,1
矩形:
大小:self.size
pos:self.pos
房车:房车
方向:“垂直”
网格布局:
科尔斯:3
行数:2
尺寸提示:无
高度:dp(108)
填充:dp(8)
间距:dp(16)
按钮:
文本:“填充列表”
按以下键:root.populate()
按钮:
文本:“排序列表”
按:root.sort()
按钮:
文本:“清除列表”
按:root.clear()
盒子布局:
间距:dp(8)
按钮:
文本:“插入新项目”
按:root.insert(新项目输入文本)
文本输入:
id:新项目输入
大小提示:0.6
提示文字:“值”
填充:dp(10),dp(10),0,0
盒子布局:
间距:dp(8)
按钮:
文本:“更新第一项”
按:root.update(更新项目输入文本)
文本输入:
id:更新项目输入
大小提示:0.6
提示文字:“新值”
填充:dp(10),dp(10),0,0
按钮:
文本:“删除第一项”
按:root.remove()
回收审查:
id:rv
滚动类型:['bar','content']
滚轮距离:dp(114)
钢筋宽度:dp(10)
viewclass:“行”
循环利用布局:
默认大小:无,dp(56)
默认大小提示:1,无
尺寸提示:无
高度:自身最小高度
方向:“垂直”
间距:dp(2
from random import sample, randint
from string import ascii_lowercase


from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout


kv = """
<Row@RecycleKVIDsDataViewBehavior+BoxLayout>:
    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 1
        Rectangle:
            size: self.size
            pos: self.pos
    value: ''
    Label:
        id: name
    Label:
        text: root.value

<Test>:
    canvas:
        Color:
            rgba: 0.3, 0.3, 0.3, 1
        Rectangle:
            size: self.size
            pos: self.pos
    rv: rv
    orientation: 'vertical'
    GridLayout:
        cols: 3
        rows: 2
        size_hint_y: None
        height: dp(108)
        padding: dp(8)
        spacing: dp(16)
        Button:
            text: 'Populate list'
            on_press: root.populate()
        Button:
            text: 'Sort list'
            on_press: root.sort()
        Button:
            text: 'Clear list'
            on_press: root.clear()
        BoxLayout:
            spacing: dp(8)
            Button:
                text: 'Insert new item'
                on_press: root.insert(new_item_input.text)
            TextInput:
                id: new_item_input
                size_hint_x: 0.6
                hint_text: 'value'
                padding: dp(10), dp(10), 0, 0
        BoxLayout:
            spacing: dp(8)
            Button:
                text: 'Update first item'
                on_press: root.update(update_item_input.text)
            TextInput:
                id: update_item_input
                size_hint_x: 0.6
                hint_text: 'new value'
                padding: dp(10), dp(10), 0, 0
        Button:
            text: 'Remove first item'
            on_press: root.remove()

    RecycleView:
        id: rv
        scroll_type: ['bars', 'content']
        scroll_wheel_distance: dp(114)
        bar_width: dp(10)
        viewclass: 'Row'
        RecycleBoxLayout:
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'
            spacing: dp(2)
"""

Builder.load_string(kv)


class Test(BoxLayout):

    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.populate()

    def populate(self):
        self.rv.data = [
            {'name.text': ''.join(sample(ascii_lowercase, 6)),
             'value': str(randint(0, 2000))}
            for x in range(50)]


    def sort(self):
        self.rv.data = sorted(self.rv.data, key=lambda x: x['name.text'])

    def clear(self):
        self.rv.data = []

    def insert(self, value):
        self.rv.data.insert(0, {
            'name.text': value or 'default value', 'value': 'unknown'})

    def update(self, value):
        if self.rv.data:
            self.rv.data[0]['name.text'] = value or 'default new value'
            self.rv.refresh_from_data()

    def remove(self):
        if self.rv.data:
            self.rv.data.pop(0)


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


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