2017-05-09 25 views
1

我真的是新的基维和我试图在画布上放置一些文本,但我发现我使用的Label未正确定位。如果我使用相同的值绘制Rectangle,它具有正确的位置。Kivy:标签有另一个位置,然后矩形

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

这里是我的代码:

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

好吧,你忘了检查首先标签的大小。默认的一个总是[100, 100]。作为孩子,您没有在任何地方添加Label,因此它忽略了size_hint,默认设置为[1, 1]

最终结果是:

  • Label按钮区是[100, 100]
  • Label质地[something, something](对我来说这是[160, 32]

现在你创建一个RectangleLabel的大小纹理大小并将其放置在某处,然后移动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()) 
+0

感谢您的回复。好吧,我不知道texture_size与label.size不同。我认为这是我想念的一点。你提到了size_hint。考虑到这个问题,它有什么问题?我没有得到这个问题的背景。 –

+0

@ S-Man看看['Label.texture_size'](https://kivy.org/docs/api-kivy.uix.label.html#kivy.uix.label.Label.texture_size)看看发生了什么。关于'size_hint',那么,如果一个小部件被添加到可以使用这些值(主要是布局)的父项中,那么它将与这些值一起工作。在绘制“MyClass”的'canvas“时,您将'Label'创建为完全独立的Python对象,因此不使用parent = no'size_hint'。 – KeyWeeUsr

相关问题