首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >布局布局问题

布局布局问题
EN

Stack Overflow用户
提问于 2019-10-13 23:21:34
回答 1查看 28关注 0票数 1

我正在编写一个类似于kivy的CMQ应用程序。我的布局显示有一个问题:一些多行按钮没有出现。我希望每一行都适合内容。

这是我的第一篇文章,如果提问的方式有误,请随时提出来。

我尝试过网格,盒子,带有许多.bind的StackLayouts (Minimum_height)等等。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-14 10:13:10

您正在使用下面的代码行考虑QuestionApplication子代的大小:

代码语言:javascript
复制
self.bind(minimum_height=self.setter('height'))

但是vbox的大小并没有考虑到它的子进程的变化。

在您的QuestionApplication __init__()方法中,您需要添加

代码语言:javascript
复制
vbox.bind(minimum_height = vbox.setter('height'))

在创建vbox之后。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58364968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档