Kivy:如何从自定义 BoxLayout 显示 ScrollView?
Posted
技术标签:
【中文标题】Kivy:如何从自定义 BoxLayout 显示 ScrollView?【英文标题】:Kivy: How to display a ScrollView from an custom BoxLayout? 【发布时间】:2019-10-21 07:24:15 【问题描述】:我需要创建一个具有自定义行布局的项目列表。每行都应该有一个图像,一个主按钮和两个其他小按钮(并排),按下主按钮后,我想在该行下方的滚动视图中显示一个短文本。 我正在使用如下所示的自定义 BoxLayout:
<InfoRow@BoxLayout>:
landmarkName: self.landmarkName
pozaId: self.pozaId
rowId: self.rowId
starId: self.starId
svId: self.svId
show_infoId: self.show_infoId
orientation: 'vertical'
size_hint_y: None
height:self.minimum_height
BoxLayout:
size_hint_y: None
height: 50
pos_hint: "x": 0, 'top': 1
AsyncImage:
size_hint_x: 0.2
id: root.pozaId
source: root.srcImg
ToggleButton:
id: root.rowId
font_size: self.height * 0.5
text_size: self.size
text: root.landmarkName
on_release: root.toggle_info()
ToggleButton:
#on_release: self.parent.parent.ids.calc_input.text += self.text
size_hint: None, None
width: 50
height: 50
background_down: 'data/check.png'
background_normal: 'data/full_plus.png'
ToggleButton:
id: root.starId
size_hint: None, None
height: 50
width: 50
background_down: root.starImg
background_normal: root.starImg
on_release: root.saveLocation()
ScrollView:
id: root.svId
size_hint_y: None
pos_hint: "x": 0.12, 'top': 1
height: 0
InfoTextInput:
id: root.show_infoId
text: ""
size_hint_y: None
height: self.minimum_height
还有我的python代码:
class InfoRow(BoxLayout):
pozaId = StringProperty(' ')
rowId = StringProperty(' ')
starId = StringProperty(' ')
svId= StringProperty(' ')
show_infoId=StringProperty(' ')
landmarkName = StringProperty(' ')
pressed = False
starImg = StringProperty('data/white.png')
srcImg = StringProperty('data/white.png')
def __init__(self, **kwargs):
super(InfoRow, self).__init__(**kwargs)
def toggle_info(self):
self.pressed = not self.pressed
if self.pressed:
height = self.height * .25
else:
height = 0
Animation(height=height, d=.25, t='out_quart').start(
self.ids[self.svId])
if not self.pressed:
self.ids[self.show_infoId].focus = False
return
self.ids[self.show_infoId].text = "TO DO"
self.ids[self.svId].scroll_y = 1
def saveLocation(self):
pass
我在哪里创建我的列表:
类 MainScreen(Screen):
def getSpecificInfo(self, category):
...
self.ids["extraInfo"].clear_widgets()
for i in range (0, 15):
wid = InfoRow(pozaId = pozaId, landmarkName=landmarkName, starImg = starImg ,rowId = rowId, starId = starId, svId= svId, show_infoId=show_infoId)
self.ids["extraInfo"].add_widget(wid)
现在我设法动态创建了我的列表,但是在按下按钮后 ScrollView 没有显示,并且出现以下错误:
self.ids[self.svId])
KeyError: 'sv0'
我不知道我做错了什么。 有什么想法吗?
【问题讨论】:
【参考方案1】:问题 - KeyError
self.ids[self.svId])
KeyError: 'sv0'
根本原因
表示self.svId
中的值'sv0'
在self.ids
字典类型属性中不存在。
注意
在 Python 代码中动态创建的小部件,分配给小部件的id
不会添加到self.ids
。您可能想创建自己的字典来存储它们以供以后访问。
【讨论】:
你能告诉我应该在字典中存储哪些信息以及如何从中访问 ScrollView 吗?我想我应该先存储 id 和小部件,然后再将其添加到我的布局中,但我不确定如何访问 ScrollView,或者我可以分别插入行布局和滚动视图?以上是关于Kivy:如何从自定义 BoxLayout 显示 ScrollView?的主要内容,如果未能解决你的问题,请参考以下文章