Kivy - Scrollview - Как узнать, какие виджеты отображаются в данный момент - PullRequest
1 голос
/ 21 июня 2020

У меня есть вид прокрутки с дочерним элементом GridLayout, и в gridlayout добавлено множество меток различной высоты. У меня вопрос: как узнать, какой виджет отображается на экране в любое время? Причина в том, что я хочу показать детали самой верхней видимой метки в другой части экрана (чтобы показать, какой виджет сейчас находится вверху видимой области прокрутки). Например, если в сетке 50 меток, при прокрутке на экране может отображаться 4 метки (из-за размера прокрутки) для примеров 23, 24, 25 и 26. В этом случае, как узнать метку 23, отображается на верхняя часть видимой области прокрутки?

ОБНОВЛЕНО:

пример кода, показывающий объяснение выше

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.label import MDLabel
from kivymd.uix.behaviors.focus_behavior import ButtonBehavior

KV = '''
BoxLayout:
    orientation: 'vertical'
    MDLabel:
        id : lbl_id
        text: 'This should show the top label in scrollview below(red canvas) dynamically as we scroll'
        size_hint : (1,None)
        height : self.texture_size[1]
    MDSeparator:
    ScrollView:
        id : scroll_id
        size_hint_y:None
        height : root.height - (lbl_id.height)
        do_scroll_x: False
        do_scroll_y: True
        scroll_type: ['bars', 'content']
        canvas:
            Color:
                rgba: [1,0,0,0.5]
            Rectangle:
                pos: self.pos[0],self.height-100
                size: self.size

        GridLayout:
            id:grid_id
            cols: 1
            height: self.minimum_height
            size_hint_y:  None
'''

class MyMDLabel(ButtonBehavior, MDLabel ):
    pass

class Example(MDApp):
    def build(self):
        self.res=Builder.load_string(KV)

        for i in range(20):
            lbl = MyMDLabel(text='pressme Label-%d ' % (i), size_hint=(1, None) )
            lbl.bind(on_release=self.update_lbl)
            self.res.ids.grid_id.add_widget(lbl)

        return self.res

    def update_lbl(self,instance):
        content='\nThis should show the top label in scrollview below(red canvas) dynamically as we scroll'
        self.res.ids.lbl_id.text=instance.text + content


Example().run()
...