Kivy 标签左对齐和调整大小

Posted

技术标签:

【中文标题】Kivy 标签左对齐和调整大小【英文标题】:Kivy label left align and sizing 【发布时间】:2017-12-21 10:03:12 【问题描述】:

我已经靠着这堵墙跑了快一天了。我觉得我已经尝试了一切。首先是我想要的以及我在视觉上拥有的。

这是我现在拥有的:

我想要的是这个:

在图像中,“CurrentHistory:\nHeader:”是一个标签。我可以让它左对齐,但我不能让它没有大量的顶部和底部填充。我就像标签是方形的,而不是文本周围的矩形。我已经 Kivy'ing 大约 2 天了,所以如果我错过了一些超级基本的东西,请原谅我。

编辑

我更新了一个功能齐全的演示。奇怪的是,.kv 生成的标签完全符合我的要求,但通过 python 生成的标签却没有。

SegmentLayout 与 .kv 文件中定义的 GridLayout 相同:(

整体布局是这样的:.kv

#:kivy 1.8.0

<MainWidget>
    BoxLayout
        size: root.size

        ScrollView
            id: scrlv
            size_hint: .75, 1

            GridLayout
                cols: 1
                size_hint: 1, None
                height: max(self.minimum_height, scrlv.height)

                canvas:
                    Color:
                        rgba: 150/255, 150/255, 150/255, 1
                    Rectangle:
                        pos: self.pos
                        size: self.size

                SegmentLayout

                GridLayout
                    cols: 1
                    size_hint: 1,None
                    height: self.minimum_height

                    Label
                        text: '[b]CurrentHistory:[/b]\nHeader:'
                        size_hint: (None, None)
                        halign: 'left'
                        markup: True
                        size: self.texture_size

                    TextInput
                        size_hint: (1,None)
                        height: self.minimum_height
                        text: 'Enter Text Here'

        BoxLayout
            orientation: "vertical"
            size_hint: .25, 1

            canvas:
                Color:
                    rgba: 240/255, 180/255, 80/255, 1
                Rectangle:
                    pos: self.pos
                    size: self.size

            Label
                text: "Label 1"
            Label
                text: "Label 2"

python 驱动演示

import kivy

kivy.require('1.8.0') # replace with your current kivy version !

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.factory import Factory

from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput

class SegmentLayout(GridLayout):

    def __init__(self, **kwargs):
        super(SegmentLayout, self).__init__(cols=1, size_hint=(1,None), **kwargs)
        self.bind(minimum_height=self.setter('height'))

        label_text = '[b]CurrentHistory:[/b]\nHeader:'

        label = Label(text=label_text, halign='left', size_hint=(None,None), markup=True)
        label.bind(size=label.setter('texture_size'))    
        self.add_widget(label)

        text_input = TextInput(text='Enter Text Here', size_hint=(1,None))
        text_input.bind(minimum_height=text_input.setter('height'))
        self.add_widget(text_input)

class MainWidget(Widget):
    pass

class MyApp(App):

    def build(self):
        return MainWidget()

Factory.register('SegmentLayout', cls=SegmentLayout)

if __name__ == '__main__':
    MyApp().run()

【问题讨论】:

我添加了一个功能齐全的演示,奇怪的是,当我在简单的 .kv 文件中制作我想要的东西时,它按预期工作,当通过 python 完成它时它失败了。 .kv 文件符合我的预期。 【参考方案1】:

我发现以下链接https://kivy.org/docs/api-kivy.uix.label.html#kivy.uix.label.Label.halign 警告不要使用 halign 属性。我没有halign的解决方案如下:

            BoxLayout:
                size_hint_y: None
                height: sized_label.height
                Label:
                    id: sized_label
                    text: "[b]CurrentHistory:[/b]\\nHeader:"
                    size_hint: (None, None)
                    markup: True
                    size: self.texture_size
                Label:

我在 BoxLayout 中放置带有您的文本的标签。我将尺寸高度设置为带有文本的标签的尺寸。带有文本的标签的大小与其文本的大小相同。由于带有文本的标签不如 BoxLayout 宽,因此我使用另一个标签来填充空白区域。

这是您的更新代码。我把它全部放在 .py 文件中,因为你在 cmets 中说你正在为此苦苦挣扎。我也删除了很多代码,因为它是双重的或不必要的。我希望现在您可以更轻松地继续使用它。我还为您的 TextInput 使用了 text_hint 之类的东西。如果您不希望恢复这些更改应该很容易......

这是我更新的代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.factory import Factory

from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput

from kivy.base import Builder

kv_string = Builder.load_string("""
BoxLayout:
    BoxLayout:
        canvas:
            Color:
                rgba: 150/255, 150/255, 150/255, 1
            Rectangle:
                pos: self.pos
                size: self.size

        ScrollView:
            id: scrlv

            GridLayout:
                cols: 1
                size_hint_y: None
                height: max(self.minimum_height, scrlv.height)

                BoxLayout:
                    size_hint_y: None
                    height: sized_label.height
                    Label:
                        id: sized_label
                        text: "[b]CurrentHistory:[/b]\\nHeader:"
                        size_hint: (None, None)
                        markup: True
                        size: self.texture_size
                    Label:

                TextInput:
                    size_hint_y: None
                    height: 80
                    hint_text: 'Enter Text Here'
                Label:

    BoxLayout:
        orientation: "vertical"
        size_hint_x: .25

        canvas:
            Color:
                rgba: 240/255, 180/255, 80/255, 1
            Rectangle:
                pos: self.pos
                size: self.size

        Label:
            text: "Label 1"
        Label:
            text: "Label 2"
""")



class MyApp(App):

    def build(self):
        return kv_string



if __name__ == '__main__':
    MyApp().run()

【讨论】:

问题不在于我无法让标签按我想要的方式工作,而是通过 kv 文件进行操作会得到我想要的结果,而通过 python 进行操作却没有。在我的演示文件中,SegmentLayout 与 kv 文件中定义的网格布局姐妹相同。唯一的区别是 SegmentLayout 是在 python 中定义的 vs 在 kv 文件中。 我在我发布的kv文件中添加了SegmentLayout。当我编辑问题时,我确实将我的 python 文件和我的 kv 文件复制到了原始帖子中。我在哪里错过了':'?我提供的演示表明,段布局的行为与完全相同的 kv 定义的结构不同,我不知道为什么

以上是关于Kivy 标签左对齐和调整大小的主要内容,如果未能解决你的问题,请参考以下文章

两个标签在tableView单元格中垂直对齐自动调整大小

Kivy 如何创建一个可根据内容调整大小的弹出窗口?

在右div移动到底部之前调整左div的大小

在 Xcode 中自动调整标签行的大小有意外的结果

自动布局调整多个标签的大小

左对齐内容并自动调整 div