Ярлыки перекрываются в рамке, а не в скролле - PullRequest
0 голосов
/ 06 июля 2018

У меня есть большой объем текста, который нужно поместить на экран в виде прокрутки, и поэтому я строю строку, чтобы создать вид прокрутки, в который я добавляю разметку сетки (или любой макет), чтобы заполнить метками, каждая из которых содержит текст. Мой код ниже: KV:

ScrollView:
#The scrollview that the gridlayout filled with labels is added to.
            size_hint: 1, .8
            id: content_holder_kv

PY:

layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
#The gridlayout that the labels will be added to and that will then be added to the scrollview.
layout.bind(minimum_height=layout.setter('height'))
for i in range(1141):
    temp = ("Long stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong string")
    line_of_text = Label(text=temp,text_size=(self.size))
    #This is the part ^ that I think is causing the issues. When I didnt have(text_size=(self.size)) the labels just went off the end of the screen. I have attempted adding text size as well as other attributes to try to get the wrapping behavior I need where the text label uses the entire width of the screen, is multiline, and doesnt overlap text with other labels in the scrollview but I have been unable to achieve this behavior.
    layout.add_widget(line_of_text)
self.content_holder_py.add_widget(layout)

Некоторые вещи, которые я не думаю, имеют значение, но могут упомянуть, что в моем приложении несколько экранов, и я пытаюсь разделить строки, потому что я пытаюсь отобразить главу книги. строка текста - это текст / абзац из книги, который мне нужно обернуть, не перекрывая другие текстовые метки. Ниже приведено изображение того, что производит этот код (пробовал другие варианты настройки макета, и я не уверен, что я испортил, чтобы вызвать это). enter image description here

1 Ответ

0 голосов
/ 06 июля 2018

Метка, которая может расти вертикально, но оборачивает текст на определенную ширину:

<CustomLabel>:
    size_hint_y: None
    text_size: self.width, None
    height: self.texture_size[1]

Чтобы прокрутить GridLayout по его оси X / по горизонтали и Y / по вертикали, установите для свойства size_hint значение (Нет, нет).

ScrollView - ScrollEffect, scroll_type , bar_width и т. Д.

По умолчанию ScrollView позволяет прокручивать по осям X и Y. Вы можете явно отключить прокрутку на оси, установив для свойств do_scroll_x или do_scroll_y значение False.

Чтобы прокрутить GridLayout по его оси Y / по вертикали, установите дочерний элемент ширину ScrollView (size_hint_x = 1) и установите Свойство size_hint_y для None:

Когда прокрутка выходит за границы ScrollView, она использует ScrollEffect для обработки переполнения.

scroll_type

Устанавливает тип прокрутки, который будет использоваться для содержимого просмотра прокрутки. Доступны следующие варианты: [‘content’], [‘bars’], [‘bars’, ‘content’]

[‘bars’] Контент прокручивается путем перетаскивания или прокрутки полос прокрутки.

Пример

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.properties import ObjectProperty


class CustomLabel(Label):
    pass


class RootWidget(BoxLayout):
    content_holder_py = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(RootWidget, self).__init__(**kwargs)
        temp = "Long stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong stringLong string"

        for i in range(1141):
            line_of_text = CustomLabel(text=temp)
            self.content_holder_py.add_widget(line_of_text)


class TestApp(App):
    title = "Kivy ScrollView of Labels Demo"

    def build(self):
        return RootWidget()


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

test.kv

#:kivy 1.11.0
#:import Window kivy.core.window.Window

<CustomLabel>:
    size_hint_y: None
    text_size: self.width, None
    height: self.texture_size[1]

<RootWidget>:
    orientation: "vertical"
    content_holder_py: content_holder_kv

    ScrollView:
        bar_width: 10
        bar_color: 0, 0, 1, 1   # blue
        bar_inactive_color: 1, 0, 0, 1   # red
        effect_cls: "ScrollEffect"
        scroll_type: ['bars']
        size_hint: (1, None)
        size: (Window.width, Window.height)

        GridLayout:
            id: content_holder_kv
            cols: 1
            spacing: 10
            size_hint_y: None
            height: self.minimum_height

выход

Img01 - App Startup Img02 - Scrolling Labels

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...