A.Piquer A.Piquer - 6 months ago 62
Python Question

How to set a height to some buttons of GridLayout in Kivy Python?

I'm working in an app with kivy and I have an issue that involve the

GridLayout
. I have a screen with different rows and I want the buttons of the last row to have always the same
height
(11,1% of the height of the Screen). I have tried to modify the attribute height in the buttons but doesn't work properly. With
size_hint_y
works fine , but the fact is that i want to do with
height
because the screen won't have always the same number of rows (is responsive and it depends of the selections of previous screens). I attach here the code that I've done with the attribute height calculated through the command
Window.height/9
:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window


class LoginScreen(GridLayout):
def __init__(self,**kwargs):
super(LoginScreen, self).__init__(**kwargs)
self.cols=2
self.add_widget(Label(text='Subject'))
self.add_widget(Label(text=''))
self.add_widget(Label(text='1'))
self.add_widget(TextInput(multiline=False))
self.add_widget(Label(text='2'))
self.add_widget(TextInput(multiline=False))
self.add_widget(Label(text='3'))
self.add_widget(TextInput(multiline=False))
self.add_widget(Label(text='4'))
self.add_widget(TextInput(multiline=False))
b1=Button(text='Exit',background_color=[0,1,0,1],height=int(Window.height)/9.0) #doesn't work properly
self.add_widget(b1)
b2=Button(text='Run',background_color=[0,1,0,1],height=int(Window.height)/9.0) #doesn't work properly
self.add_widget(b2)
b1.bind(on_press=exit)




class SimpleKivy(App):
def build(self):
return LoginScreen()


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


I know it could be done with kivy language in a easier way but for my app is better to do in this way. If anyone knows how to fix this problem I would be very grateful.

Answer

If you want a widget in a grid/box layout to have a fixed size, you should set its size_hint to None first. And always use kivy lang at such tasks - no exceptions.

from kivy.app import App
from kivy.uix.screenmanager import Screen

from kivy.lang import Builder

gui = '''
LoginScreen:

    GridLayout:
        cols: 2

        Label:
            text: 'Subject'

        Label:

        Label:
            text: '1'

        SingleLineTextInput:

        Label:
            text: '2'

        SingleLineTextInput:

        Label:
            text: '3'

        SingleLineTextInput:

        Label:
            text: '4'

        SingleLineTextInput:

        GreenButton:
            text: 'Exit'
            on_press: app.stop()

        GreenButton:
            text: 'Run'


<SingleLineTextInput@TextInput>:
    multiline: False


<GreenButton@Button>:
    background_color: 0, 1, 0, 1
    size_hint_y: None
    height: self.parent.height * 0.111
'''


class LoginScreen(Screen):
    pass


class SimpleKivy(App):

    def build(self):
        return Builder.load_string(gui)


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