2017-05-09 4 views
1

저는 Kivy를 처음 접했고 캔버스에 텍스트를 배치하려고했지만 문자가 Label인데 제대로 배치되지 않았습니다. 같은 값으로 Rectangle을 그리면 올바른 위치에 놓입니다.Kivy : 레이블에 다른 위치가 있습니다. 사각형

나는 비슷한 질문을 몇 개 발견했지만 나에게는 답이 없다고 생각합니다. 여기

내 코드입니다 :

당신이 예상대로 Rectangle 위치가 수평으로 중앙에 볼 수 있듯이하지만 Label가 중앙하지 않으며이되지도 :

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) 

결과는 같다 오른쪽 높이 위치.

왜 차이가 있는지 말해 줄 수 있습니까?

감사합니다.

답변

1

글쎄, 라벨의 크기를 확인하는 것을 잊어 버렸습니다. 기본값은 항상 [100, 100]입니다. Label을 자식으로 추가하지 않으므로 기본적으로 [1, 1]으로 설정된 size_hint을 무시합니다.

최종 결과 :

  • Label 위젯 영역이 [100, 100]
  • Label 질감입니다 [something, something] (나에게 그건 [160, 32])

이제 Label 년대의 크기의 Rectangle를 만들 텍스처 크기를 지정하고 어딘가에 배치 한 다음 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'에 관해서, 위젯은 그 값들 (주로 레이아웃들)을 가지고 작업 할 수있는 부모에 추가된다면 그 값들과 함께 작동합니다. 'Label '을'MyClass'의'canvas'에 그리는 동안 완전히 별개의 파이썬 객체로 만들었습니다. 그러므로 parent = no'size_hint'는 사용되지 않습니다. – KeyWeeUsr