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