我正在编写一个类似于kivy的CMQ应用程序。我的布局显示有一个问题:一些多行按钮没有出现。我希望每一行都适合内容。
这是我的第一篇文章,如果提问的方式有误,请随时提出来。
我尝试过网格,盒子,带有许多.bind的StackLayouts (Minimum_height)等等。
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()发布于 2019-10-14 10:13:10
您正在使用下面的代码行考虑QuestionApplication子代的大小:
self.bind(minimum_height=self.setter('height'))但是vbox的大小并没有考虑到它的子进程的变化。
在您的QuestionApplication __init__()方法中,您需要添加
vbox.bind(minimum_height = vbox.setter('height'))在创建vbox之后。
https://stackoverflow.com/questions/58364968
复制相似问题