如何正确地在BoxLayout中定位Label Widgets

时间:2018-04-22 08:25:20

标签: python kivy

我有这个带有kv的python代码,它有一个ScrollView小部件,可以让我水平和垂直滚动。

from kivy.app import App
from kivy.lang import Builder

main_kv = """

ScrollView:

    BoxLayout:
        orientation: "vertical"
        size_hint: (None, None)
        width: self.minimum_width
        height: self.minimum_height

        Label:
            text: "A veryyyyyyyyyyyyyyyyyyyyy long text."
            font_size: sp(30)
            size_hint: (None, None)
            height: dp(30)
            width: self.texture_size[0]

"""

class TestApp(App):

    def build(self):
        return Builder.load_string(main_kv)

TestApp().run()

以上代码有效...但我的目标是添加一个按钮,按下时,BoxLayout小部件将添加一个新的Label小部件..

我尝试用这个来修改代码,但是:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.metrics import dp, sp
from kivy.uix.boxlayout import BoxLayout


main_kv = """

<Main>:

    ScrollView:

        BoxLayout:
            id: boxlayout_id
            orientation: "vertical"
            size_hint: (None, None)
            width: self.minimum_width
            height: self.minimum_height

            Label:
                text: "A veryyyyyyyyyyyyyyyyyyyyy long text."
                font_size: sp(30)
                size_hint: (None, None)
                height: dp(30)
                width: self.texture_size[0]

    Button:
        text: "Add Label"
        on_press: root.add_newlabel()          
"""


class Main(BoxLayout):
    def __init__(self):
        super(Main, self).__init__()

        self.orientation = "vertical"

    def add_newlabel(self, *args):
        newLabel = Label()
        newLabel.text = " A veryyyyyyyyyyyyyyyyyyyyy long text."
        newLabel.font_size = sp(30)
        newLabel.size_hint = (None, None)
        newLabel.height = dp(30)
        newLabel.width = newLabel.texture_size[0]

        self.ids.boxlayout_id.add_widget(newLabel)


class TestApp(App):

    def build(self):       
        Builder.load_string(main_kv)      
        return Main()               

TestApp().run()

修改后的代码的问题是newLabel小部件的位置是奇数。

让我们来看看这张图片。

下面的图像是输出(尚未点击按钮)。

enter image description here

这是正常的,没关系。

下面的图片是我点击Button小部件三次后的输出。

enter image description here

正如我们所看到的,三个新的Label小部件的x位置已经过时了。

我试图分析这个问题的原因是什么,但我无法弄清楚。

我会感激任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以创建模板并添加模板,而不是每次添加时都创建新的Label并添加属性。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout

main_kv = """
<CustomLabel>:
    font_size: sp(30)
    size_hint: (None, None)
    multiline:True
    size: self.texture_size

<Main>:
    scroll_view: sv
    boxlayout: boxlayout_id
    ScrollView:
        id: sv
        BoxLayout:
            id: boxlayout_id
            orientation: "vertical"
            height: self.minimum_height
            size_hint: (None, None)

    Button:
        text: "Add Label"
        on_press: root.add_newlabel()          
"""

class CustomLabel(Label):
    pass

class Main(BoxLayout):
    def __init__(self):
        super(Main, self).__init__()
        self.orientation = "vertical"
    def add_newlabel(self, *args):
        newLabel = CustomLabel()
        newLabel.text = " A veryyyyyyyyyyyyyyyyyyyyy long text."
        self.boxlayout.add_widget(newLabel)
        self.scroll_view.scroll_to(newLabel)

class TestApp(App):
    def build(self):       
        Builder.load_string(main_kv)      
        return Main()               

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

enter image description here