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?的主要内容,如果未能解决你的问题,请参考以下文章

Kivy ScreenManager 打破 BoxLayout

Kivy 标签和弹出窗口 + 长文本

使用 Kivy 同时显示多个时钟

Kivy:BoxLayout 与 GridLayout

Kivy BoxLayout 将小部件与顶部边框对齐

输入直到离开kivy时如何调用函数?