Kivy: Как отобразить ScrollView из пользовательского BoxLayout? - PullRequest
3 голосов
/ 05 июня 2019

Мне нужно создать список элементов с пользовательским макетом строки. В каждой строке должно быть изображение, одна основная кнопка и две другие маленькие кнопки (рядом), после нажатия основной кнопки я хотел бы отобразить короткий текст в виде прокрутки под строкой. Я использую пользовательский 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 (Экран):

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 голосов
/ 05 июня 2019

Проблема - KeyError

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

первопричина

Это означает, что значение 'sv0' в self.svId не существует в self.ids свойстве типа словаря.

Примечание

Виджет, создаваемый динамически в коде Python, id, назначенный виджету, не добавляется в self.ids. Возможно, вы захотите создать свой собственный словарь для хранения их для последующего доступа к нему.

...