Как включить scrollview для динамически создаваемых ярлыков в kivy? - PullRequest
3 голосов
/ 06 ноября 2019

Мое приложение содержит 2 экрана:

1-й экран: экран приветствия - ярлык для отображения приветственного сообщения и кнопка для перехода к следующему экрану

2-й экран: динамически создаваемые ярлыки

Я хотел бы реализовать scrollview для моего второго экрана, который содержит динамически создаваемые метки. Я пытался, но scrollview не работает.

Ниже приведен мой код:

main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

class Welcome(Screen):
    pass

class Second(Screen):
    dynamic_labels = []    

    texts = ['Label '+str(i) for i in range(1,20)]
    no_widgets = len(texts)

    def set_data(self):
        for data,wid in zip(self.texts,self.dynamic_labels):
            wid.text = data

class WindowManager(ScreenManager):
    pass    

class SampleApp(App):   

    def build(self):
        return Builder.load_file("questapp\mytest.kv")

if __name__ == "__main__":
    SampleApp().run()

mytest.kv

#: import Label kivy.uix.label.Label

WindowManager:
    Welcome:
    Second:

<Welcome>
    name: "Welcomescreen"

    GridLayout:
        cols:1

        Label:
            text: "Welcome to my app"

        Button:
            text: "Proceed"
            on_press: 
                app.root.current = "screen2"

<Second>
    name: "screen2"

    FloatLayout:
        ScrollView:
            do_scroll_y: True
            do_scroll_x: True

            GridLayout:
                spacing:20
                padding: 20
                size_hint: 1,None
                height:500
                cols:1
                on_kv_post:
                    for i in range(root.no_widgets):root.dynamic_labels.append(Label(size_hint = (0.1,None),height = 30))

                    for wid in range (root.no_widgets):self.add_widget(root.dynamic_labels[wid])

                    root.set_data()

1 Ответ

0 голосов
/ 06 ноября 2019

Просто установите GridLayout s height на self.minimum_height.
Вот как должно быть ваше правило Second kv:

<Second>
    name: "screen2"

    FloatLayout:
        ScrollView:
            do_scroll_y: True
            do_scroll_x: True

            GridLayout:
                spacing:20
                padding: 20
                size_hint: 1,None
                # height: 500
                height: self.minimum_height
                cols:1
                on_kv_post:
                    for i in range(root.no_widgets): root.dynamic_labels.append(Label(size_hint = (0.1,None),height = 30))

                    for wid in range (root.no_widgets): self.add_widget(root.dynamic_labels[wid])

                    root.set_data()
...