Kivy:如何从自定义BoxLayout显示ScrollView?

时间:2019-06-05 18:45:22

标签: python kivy scrollview kivy-language

我需要创建具有自定义行布局的项目列表。每行应有一个图像,一个主按钮和另外两个小按钮(并排),按下主按钮后,我想在该行下方的滚动视图中显示一个短文本。 我使用的自定义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 个答案:

答案 0 :(得分:0)

问题-KeyError

self.ids[self.svId])
 KeyError: 'sv0'

根本原因

这意味着 'sv0' 字典类型属性中不存在self.svId中的self.ids值。

注意

使用Python代码动态创建的小部件,分配给该小部件的id未添加到self.ids中。您可能想要创建自己的字典来存储它们,以便以后使用。