如何更新 RecycleView Kivy
How to update RecycleView Kivy
这是我的第一个问题,很抱歉,如果屠杀它。
我正在制作一个应用程序,它将允许我工作中的其他人更有效地创建协议。
问题是,我正在尝试更新创建的 RecycleView,但由于某种原因它不起作用。网上的一些解决方案建议使用 .refresh_from_data() 方法,但是没有用,而且所有其他解决方案都太复杂(或者我太笨了)。
我有这个功能 - add_entry 将来自两个 TextInputs 的信息添加为协议列表中的字典。
目前我的 RecycleView 只显示数字,因为没有任何解决方案有效,实际上我什至很难制作 Recycle View。
这里是 Python 代码的相关部分:
class DrillingInfoPage(Screen):
rod = 1
dist = 3
protocol = ListProperty() # {Rod:_,Distance:_,Proc:_,Depth:_}
def add_entry(self, proc, depth):
self.protocol.append({'Rod': 0, 'Distance': 0, 'Proc': 0, 'Depth': 0})
self.protocol[self.rod-1]['Proc'] = proc
self.protocol[self.rod-1]['Depth'] = depth
self.protocol[self.rod-1]['Rod'] = self.rod
self.protocol[self.rod-1]['Distance'] = self.dist
self.rod += 1
self.dist += 3
print(self.protocol)
return self.protocol
class Profile(Screen):
pass
class WindowManager(ScreenManager):
pass
class ColorsPopup(Screen):
popupWindow = None
class Recycle(RecycleView):
def __init__(self, **kwargs):
super(Recycle, self).__init__(**kwargs)
self.data = [{'text': str(x)} for x in range(50)]
kv = Builder.load_file("my.kv")
class MyApp(App):
def build(self):
return kv
if __name__ == '__main__':
MyApp().run()
这里是 KV 文件的相关部分:
<DrillingInfoPage>:
name: 'third'
BoxLayout:
orientation: 'vertical'
Label:
size_hint: 1, .4
text: 'Drilling Info Page'
GridLayout:
size_hint: 1, .1
cols:3
GridLayout:
cols:2
Label:
text: 'BG'
TextInput:
id: start
multiline: False
GridLayout:
cols:2
Label:
text: 'BG'
TextInput:
id: end
multiline: False
Button:
text: 'Confirm'
on_release: drilling_holes.text = 'BG' + start.text + ' -----> ' + 'BG' + end.text
GridLayout:
size_hint: 1, .1
cols:3
GridLayout:
cols:2
Label:
text: '%:'
TextInput:
id: proc
multiline: False
GridLayout:
cols:2
Label:
text: 'Depth:'
TextInput:
id: depth
multiline: False
Button:
text: 'Add'
on_release: root.add_entry(proc.text, depth.text)
Label:
id: drilling_holes
size_hint: 1, .2
text: ''
Recycle:
id: drilling_data
data: self.data
viewclass: 'Label'
RecycleBoxLayout:
default_size: None, '25dp'
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
Label:
size_hint: 1, .2
text: ''
GridLayout:
size_hint: 1, .17
cols:2
Button:
text: 'Go Back'
on_release:
app.root.current = 'second'
root.manager.transition.direction = 'down'
Button:
text: 'Confirm'
on_release:
app.root.current = 'last'
root.manager.transition.direction = 'up'
我已经尝试在 RecycleView class 以及 DrillingInfoPage class 中创建一些函数来刷新数据,但似乎没有任何效果。
我是 Python 的新手,尤其是 Kivy,因此希望有智慧的人能指导我正确的方向:)
Here how the screen itself looks right now, ideally it should be empty at first and pressing 'Add' button should add a new line
您只需将新信息添加到 RecycleView
的 data
列表中。目前尚不清楚您要添加到 RecycleView
的确切内容,但您可以像这样在 add_entry()
方法中添加一行:
self.ids.drilling_data.data.append({'text': proc}) # add new entry to data list
而且该方法不需要 return
语句
这是我的第一个问题,很抱歉,如果屠杀它。
我正在制作一个应用程序,它将允许我工作中的其他人更有效地创建协议。
问题是,我正在尝试更新创建的 RecycleView,但由于某种原因它不起作用。网上的一些解决方案建议使用 .refresh_from_data() 方法,但是没有用,而且所有其他解决方案都太复杂(或者我太笨了)。
我有这个功能 - add_entry 将来自两个 TextInputs 的信息添加为协议列表中的字典。
目前我的 RecycleView 只显示数字,因为没有任何解决方案有效,实际上我什至很难制作 Recycle View。
这里是 Python 代码的相关部分:
class DrillingInfoPage(Screen):
rod = 1
dist = 3
protocol = ListProperty() # {Rod:_,Distance:_,Proc:_,Depth:_}
def add_entry(self, proc, depth):
self.protocol.append({'Rod': 0, 'Distance': 0, 'Proc': 0, 'Depth': 0})
self.protocol[self.rod-1]['Proc'] = proc
self.protocol[self.rod-1]['Depth'] = depth
self.protocol[self.rod-1]['Rod'] = self.rod
self.protocol[self.rod-1]['Distance'] = self.dist
self.rod += 1
self.dist += 3
print(self.protocol)
return self.protocol
class Profile(Screen):
pass
class WindowManager(ScreenManager):
pass
class ColorsPopup(Screen):
popupWindow = None
class Recycle(RecycleView):
def __init__(self, **kwargs):
super(Recycle, self).__init__(**kwargs)
self.data = [{'text': str(x)} for x in range(50)]
kv = Builder.load_file("my.kv")
class MyApp(App):
def build(self):
return kv
if __name__ == '__main__':
MyApp().run()
这里是 KV 文件的相关部分:
<DrillingInfoPage>:
name: 'third'
BoxLayout:
orientation: 'vertical'
Label:
size_hint: 1, .4
text: 'Drilling Info Page'
GridLayout:
size_hint: 1, .1
cols:3
GridLayout:
cols:2
Label:
text: 'BG'
TextInput:
id: start
multiline: False
GridLayout:
cols:2
Label:
text: 'BG'
TextInput:
id: end
multiline: False
Button:
text: 'Confirm'
on_release: drilling_holes.text = 'BG' + start.text + ' -----> ' + 'BG' + end.text
GridLayout:
size_hint: 1, .1
cols:3
GridLayout:
cols:2
Label:
text: '%:'
TextInput:
id: proc
multiline: False
GridLayout:
cols:2
Label:
text: 'Depth:'
TextInput:
id: depth
multiline: False
Button:
text: 'Add'
on_release: root.add_entry(proc.text, depth.text)
Label:
id: drilling_holes
size_hint: 1, .2
text: ''
Recycle:
id: drilling_data
data: self.data
viewclass: 'Label'
RecycleBoxLayout:
default_size: None, '25dp'
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
Label:
size_hint: 1, .2
text: ''
GridLayout:
size_hint: 1, .17
cols:2
Button:
text: 'Go Back'
on_release:
app.root.current = 'second'
root.manager.transition.direction = 'down'
Button:
text: 'Confirm'
on_release:
app.root.current = 'last'
root.manager.transition.direction = 'up'
我已经尝试在 RecycleView class 以及 DrillingInfoPage class 中创建一些函数来刷新数据,但似乎没有任何效果。
我是 Python 的新手,尤其是 Kivy,因此希望有智慧的人能指导我正确的方向:)
Here how the screen itself looks right now, ideally it should be empty at first and pressing 'Add' button should add a new line
您只需将新信息添加到 RecycleView
的 data
列表中。目前尚不清楚您要添加到 RecycleView
的确切内容,但您可以像这样在 add_entry()
方法中添加一行:
self.ids.drilling_data.data.append({'text': proc}) # add new entry to data list
而且该方法不需要 return
语句