锚定布局以在相对位置的屏幕中显示许多小部件

时间:2014-04-18 14:11:46

标签: python kivy

我希望在左侧,中间位置和右侧,底部的小部件中显示按钮和标签,而不使用.kv代码。这是我的代码,我无法弄清楚怎么做可以有人给出建议吗?

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.button import Button


class Container(AnchorLayout):
    def __init__(self, **kwargs):
        super(Container, self).__init__(**kwargs)

        btn = Button(text='Hello World',anchor_x='right',anchor_y='bottom')
        self.add_widget(btn)

        lbl = Label(text="Am i a Label ?",anchor_x='left',anchor_y='center')
        self.add_widget(lbl)


class MyJB(App):
    def build(self):

        parent = Container()

        return parent

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

1 个答案:

答案 0 :(得分:2)

AnchorLayout将所有小部件与给定点对齐,而不是将每个小部件与其自己的点对齐。如果您希望窗口小部件锚定在不同位置,则需要使用多个AnchorLayout。您可能还想在size或内容小部件上指定size_hintAnchorLayout

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.button import Button


class Container(FloatLayout):
    def __init__(self, **kwargs):
        super(Container, self).__init__(**kwargs)

        anchor_rb = AnchorLayout(anchor_x='right', anchor_y='bottom')
        btn = Button(text='Hello World', size=(100, 100), size_hint=(None, None))
        anchor_rb.add_widget(btn)
        self.add_widget(anchor_rb)

        anchor_lc = AnchorLayout(anchor_x='left', anchor_y='center')
        lbl = Label(text="Am i a Label ?", size=(100, 100), size_hint=(None, None))
        anchor_lc.add_widget(lbl)
        self.add_widget(anchor_lc)


class MyJB(App):
    def build(self):

        parent = Container()

        return parent

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

就个人而言,我发现kv比手动创建小部件更清晰,它有助于在UI和行为之间提供明确的分离。

kv版:

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

root = Builder.load_string('''
FloatLayout:
    AnchorLayout:
        anchor_x: 'right'
        anchor_y: 'bottom'

        Button:
            text: 'Hello World'
            size: 100, 100
            size_hint: None, None

    AnchorLayout:
        anchor_x: 'left'
        anchor_y: 'center'

        Label:
            text: 'Am i a Label ?'
            size: 100, 100
            size_hint: None, None
''')

class MyJB(App):
    def build(self):
        return root

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