Kivy - Scrollview - How to know which widgets are shown currently

Viewed 265

I have a scroll view with GridLayout child and lany varying height labels are added in gridlayout. My question is, How to know which widget is shown in the screen at any time? Reason is, I want to show the details of topmost visible label in other part of the screen(to show which widget is top of the visible scrollview area now). For ex, if the gridlayout has 50 labels, when we scroll, screen might show 4 labels(due to size of the scrollview) for ex 23,24,25 and 26. In this case, how to know label 23 is being shown at the top of the scroll view visible area?

UPDATED:

sample code showing above explanation

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()
0 Answers
Related