title: Dynamically resizing a kivy label (and button) on the python side
body: <p>How do I dynamically resize the a label or button, in particular, the text_size and height, depending on the amount of text, at run-time?</p>
  
  <p>I am aware that this question has already been answered in one way with this question:</p>
  
  <p><a href="https://stackoverflow.com/questions/19932614/dynamically-resizing-a-label-within-a-scrollview">Dynamically resizing a Label within a Scrollview?</a></p>
  
  <p>And I reflect that example in part of my code.</p>
  
  <p>The problem is dynamically resizing the labels and buttons at run-time.  Using, for example:</p>
  
  <pre><code>btn = Button(text_size=(self.width, self.height), text='blah blah')
  </code></pre>
  
  <p>...and so on, only makes the program think (and logically so) that the "self" is referring to the class which is containing the button.</p>
  
  <p>So, how do I dynamically resize these attributes in the python language, not kivy?</p>
  
  <p>My example code:</p>
  
  <pre><code>import kivy
  kivy.require('1.7.2') # replace with your current kivy version !
  
  from kivy.app import App
  from kivy.uix.screenmanager import ScreenManager, Screen
  from kivy.properties import ObjectProperty
  from kivy.uix.button import Button
  from kivy.uix.gridlayout import GridLayout
  
  i = range(20)
  
  long_text = 'sometimes the search result could be rather long \
  sometimes the search result could be rather long \
  sometimes the search result could be rather long '
  
  class ButtonILike(Button):
  
      def get_text(self):
          return long_text
  
  class HomeScreen(Screen):
      scroll_view = ObjectProperty(None)
  
      def __init__(self, *args, **kwargs):
          super(HomeScreen, self).__init__(*args, **kwargs)
          layout1 = GridLayout(cols=1, spacing=0, size_hint=(1, None), \
              row_force_default=False, row_default_height=40)
          layout1.bind(minimum_height=layout1.setter('height'),
                       minimum_width=layout1.setter('width'))
          layout1.add_widget(ButtonILike())
  
          for result in i:
  
                  btn1 = Button(font_name="data/fonts/DejaVuSans.ttf", \
                      size_hint=(1, None), valign='middle',)#, \
                      #height=self.texture_size[1], text_size=(self.width-10, None))
                  btn1.height = btn1.texture_size[1]
                  btn1.text_size = (btn1.width-20, layout1.row_default_height)
                  btn1.text = long_text
  
                  btn2 = Button(font_name="data/fonts/DejaVuSans.ttf", \
                      size_hint=(1, None), valign='middle')
  
                  btn2.bind(text_size=(btn2.width-20, None))
                  btn2.text = 'or short'
  
                  layout1.add_widget(btn1)
                  layout1.add_widget(btn2)
  
  
          scrollview1 = self.scroll_view
          scrollview1.clear_widgets()
          scrollview1.add_widget(layout1)
  
  
  class mybuttonsApp(App):
  
      def build(self):
  
          return HomeScreen()
  
  
  
  if __name__ == '__main__':
      mybuttonsApp().run()
  </code></pre>
  
  <p>And the kv file: </p>
  
  <pre><code>#:kivy 1.7.2
  
  &lt;ButtonILike&gt;:
      text_size: self.width-10, None
      size_hint: (1, None)
      height: self.texture_size[1]
      text: root.get_text()
      #on_release: root.RunSearchButton_pressed()
  
  &lt;HomeScreen&gt;:
      scroll_view: scrollviewID
      AnchorLayout:
          size_hint: 1, .1   
          pos_hint: {'x': 0, 'y': .9}
          anchor_x: 'center'
          anchor_y: 'center'
          Label:
              text: 'Button Tester'
  
      ScrollView:
          id: scrollviewID
          orientation: 'vertical'
          pos_hint: {'x': 0, 'y': 0}
          size_hint: 1, .9
          bar_width: '8dp'
  </code></pre>
  
  <p>You can see that I added the button from the kv file which displays all the behavior that I want at the top of the list.  Resize your window while running it, and you can see the magic.  And, of course, changing the text_size also makes it possible for me to align text.</p>
  
  <p>I simply have not been able to achieve the same behavior on the python side.  My app requires that the buttons be created at run-time.  I think the answer might lie with "bind()", though admittedly, I'm not sure I used it correctly in my attempts or that I understand it fully.  You can see that I tried with "btn2", which I thought would've thrown the text to the left (since halign defaults to left), but didn't seem to do anything.</p>
  
  <p>I appreciate the help.</p>