Kivy:Label有另一个位置然后是Rectangle

时间:2017-05-09 19:36:22

标签: python kivy

我对Kivy真的很陌生,我试图在画布上放置一些文字,但我发现使用的Label我没有正确定位。如果我正在使用相同的值绘制Rectangle,则它具有正确的位置。

我在这里发现了一些类似的问题,但我认为对我没有答案。

这是我的代码:

class MyClass(Widget):

    def __init__(self, **kwargs):
        super(MyClass, self).__init__(**kwargs)
        self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
        self._keyboard.bind(on_key_down=self._on_keyboard_down)

    def _keyboard_closed(self):
        pass

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        with self.canvas:   
            lbl_staticText = Label(font_size=12)       
            lbl_staticText.text = 'This is some nice random text\nwith linebreak'
            lbl_staticText.texture_update()
            textSize = lbl_staticText.texture_size
            Rectangle(pos=(1024/2 - textSize[0]/2, 600), size=(textSize[0], textSize[1])); #Rectangle with same position and same size
            lbl_staticText.pos = (1024/2 - textSize[0]/2, 600)

结果如下:

正如您所见,Rectangle位置按预期水平居中,但Label既没有居中也没有正确的高度位置。

请告诉我为什么会有区别?

谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,你忘了检查标签的大小了。默认值始终为[100, 100]。您没有将Label作为子项添加到任何位置,因此它会忽略size_hint,默认设置为[1, 1]

最终结果:

  • Label小部件区域为[100, 100]
  • Label纹理为[something, something](对我而言[160, 32]

现在,您创建一个Rectangle,其大小为Label的纹理大小并将其放置在某处,然后移动Label以对齐它。它们的尺寸不同。

取消注释最后一个注释行以查看差异。

class MyClass(Widget):
    ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        with self.canvas:
            lbl_staticText = Label(font_size=12)       
            lbl_staticText.text = 'This is some nice random text\nwith linebreak'
            lbl_staticText.texture_update()
            textSize = lbl_staticText.texture_size

            Color(1, 0, 0, 1)
            Rectangle(
                pos=(100+textSize[0]/2.0, 100),
                size=(textSize[0], textSize[1])
            )
            lbl_staticText.pos = (100+textSize[0]/2.0, 300)
            print(lbl_staticText.size, textSize, lbl_staticText.size == textSize)
            #lbl_staticText.size=(textSize[0], textSize[1])  # this!
            Color(0, 1, 0, 1)
            Rectangle(
                pos=lbl_staticText.pos,
                size=lbl_staticText.size
            )

runTouchApp(MyClass())