Kivy: нечетный интервал между метками в GridLayout - PullRequest
0 голосов
/ 09 июля 2020

Я делаю веб-скребок, который брал бы статьи с разных сайтов. Для этого я динамически добавил виджеты статей в их соответствующие GridLayout. Однако на некоторых экранах статьи размещены равномерно, а на других - нерегулярно. Кажется, что чем длиннее статья, тем меньше в ней места. Ниже приведены фрагменты моего кода, которые я считал подходящими (я бы включил все, кроме 1300+ строк).

Примеры:

Хороший интервал Хороший интервал

Неверный интервал Плохой интервал

Python:

def text_collision(self):
    labels = [i for i in self.news_articles.children]
    for label in labels:
        font_instance = 35
        label.size = label.texture_size
        if label.collide_point(*label.to_widget(*Window.mouse_pos)):
            animation = Animation(font_size=font_instance + 2, s=1 / 60, duration=.06)
            label.color = (.96, .60, .61, 1)
            if label.count == 0:
                animation.start(label)
                label.count += 1
        else:
            label.count = 0
            Animation.cancel_all(label)
            label.color = (1, 1, 1, 1)
            label.font_size = font_instance

def articles(self):
    titles = self.csv_load()[0]
    links = self.csv_load()[1]
    for lnk, items in zip(links, titles):
        if len(items.strip()) == 0 or len(lnk.strip()) == 0:
            continue
        article_widget = Label(text="[ref={}][b]{}[/b][/ref]".format(lnk, items), markup=True, 
                         font_size=35, text_size=(700, None), halign='left', size_hint_y=None)
        self.news_articles.add_widget(article_widget)
        article_widget.on_ref_press = self.openlink

Киви:

ScrollView:
    do_scroll_x: False
    do_scroll_y: True
    pos: (50, -140)
    smooth_scroll_end: 5

    GridLayout:
        id: articles
        cols: 1
        col_default_width: 700
        padding: [0, 140, 0, 0]
        size_hint_y: None
        height: self.minimum_height
        spacing: 150

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Пытался часами, но все еще не мог найти разумного решения, поэтому я придумал немного искаженный ответ. Все, что я сделал, это ограничил количество символов в зависимости от длины заголовка статьи. Таким образом, интервал был меньше споради c, поскольку все виджеты были более или менее одинаковой высоты.

0 голосов
/ 09 июля 2020

Когда вы используете height: self.minimum_height в GridLayout, вы должны четко определить heights для детей. Таким образом, size_hint_y=None без указания значения height вызовет проблемы. Попробуйте создать правило kv для Aricle_Widget, например:

class Article_Widget(Label):
    pass

И в kv:

<Article_Widget>:
    markup: True
    font_size: 35
    text_size: (700, None)
    halign: 'left'
    size_hint_y: None
    height: self.texture_size[1]

Затем в вашем методе articles():

article_widget = Article_Widget(text="[ref={}][b]{}[/b][/ref]".format(lnk, items))

Я не тестировал этот код, поэтому не могу гарантировать, что он будет работать. Но идея состоит в том, чтобы Label определял свой height, чтобы GridLayout мог правильно вычислить self.minimum_height.

...