Search code examples
pythonbuttonheightkivygrid-layout

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.


Solution

  • 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()