Проблема размещения макета - PullRequest
1 голос
/ 13 октября 2019

Я кодирую приложение CMQ, как в kivy. Проблема с отображением моего макета: некоторые многострочные кнопки не отображаются. Я хочу, чтобы каждая строка соответствовала содержанию.

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

Я пробовал использовать Grid, Box, StackLayouts со многими .bind (минимум_высок) и т.д. вкл.

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.core.window import Window

questions = []
questions.append({'question' : 'Lorem ipsum dolor Lorem ipsum dolor sit amet sit amet',
            'items':['Lorem', 'ipsum dolor nec sapien sit amet libero ', 'sit amet']})
questions.append({'question' : 'Curabitursit amet libero nec sapien nec  .',
            'items':['Lorem', 'ipsum dolor sapien nec libero',
            'sit amet libero egestas dictum eu eget neque']})
questions.append({'question' : 'Curabitur nec sapien nec  .',
            'items':['Lorem', 'ipsum dolor sapien nec libero',
            'sit amet libero egestas dictum eu eget neque']})


class MultiLineLabel(Button):
    def __init__(self, **kwargs):
        super(MultiLineLabel, self).__init__(**kwargs)
        self.text_size = self.size
        self.bind(size=self.on_size)
        self.bind(text=self.on_text_changed)
        self.size_hint_y = None  # Not needed here
        self.padding_y = 7
        self.halign = 'center'
        self.valign = 'middle'
        # self.give_height = self.texture_size[1]
        # print('init', self.give_height)

    def on_size(self, widget, size):
        self.text_size = size[0], None
        self.texture_update()
        # self.give_height = self.texture_size[1]
        # print('dans l\'ombjet', self.texture_size[1])
        if self.size_hint_y == None and self.size_hint_x != None:
            self.height = max(self.texture_size[1], self.line_height)
        elif self.size_hint_x == None and self.size_hint_y != None:
            self.width = self.texture_size[0]

    def on_text_changed(self, widget, text):
        self.on_size(self, self.size)

class QuestionApplication(GridLayout):

    def __init__(self, *args):
        super(QuestionApplication, self).__init__(*args)
        self.size_hint_y = None
        self.cols = 2
        self.spacing =10
        for ask in questions:
            label = Label(text=ask['question'],halign='center',
                      valign='top', size_hint=(0.6, None),
                      text_size=(self.width, None))
            label.bind(size=label.setter('text_size'))
            self.add_widget(label)
            vbox = GridLayout(size_hint_y=None, cols=1,
                              size_hint_x=0.4)
            for item in ask['items']:
                button = MultiLineLabel(text=item)
                vbox.add_widget(button)
            self.add_widget(vbox)
        self.bind(minimum_height=self.setter('height'))

class ExamApp(App):

    def build(self):
        return QuestionApplication()


if __name__ == '__main__':
    Window.size = (500, 400)
    ExamApp().run()

1 Ответ

0 голосов
/ 14 октября 2019

Вы учитываете размеры ваших QuestionApplication детей со строкой:

self.bind(minimum_height=self.setter('height'))

, но размер vbox не учитывает изменения в его дочерних элементах.

В вашем методе QuestionApplication __init__() вам необходимо добавить

vbox.bind(minimum_height = vbox.setter('height'))

после создания vbox.

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