Я кодирую приложение 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()