Home > Back-end >  GridLayout wrong positioning
GridLayout wrong positioning

Time:02-15

I have my simple python code:

import kivy
kivy.require('1.11.1')
from kivy.app import App
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.uix.relativelayout import RelativeLayout


Builder.load_file('Matrixkivy.kv') 
 
class MyLayout(Widget):
    pass

class MatrixCalc(App):
    def build(self):
        return MyLayout()

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

And simple .kv code:

<MyLayout>
    GridLayout:
        size_hint: root.width, root.height
        Button:
            text: "Button1"
        Button:
            text: "Button2"
            
        

I want to get a GridLayout which is of size of the entire app and two buttons, which both take half of it. However, app displays all things that the app contain in the bottom left corner. How to fix that?

CodePudding user response:

The main problem is that you are using the base Widget class as a container. You can do that, but the Layout classes already have the code to handle things like size_hint and pos_hint. One fix for your code is to replace:

class MyLayout(Widget):
    pass

with:

class MyLayout(FloatLayout):
    pass

You should also remove the line:

size_hint: root.width, root.height

Size_hint values should be numbers typically in the range 0-1. And add a line that defines either rows or cols for the GridLayout, so your kv could look like:

<MyLayout>
    GridLayout:
        cols: 1
        Button:
            text: "Button1"
        Button:
            text: "Button2"

Since you are using GridLayout as a child of MyLayout, you can just make MyLayout extend GridLayout, and then you can eliminate the GridLayout line from your kv. With this approach, your MyLayout class would look like:

class MyLayout(GridLayout):
    pass

and the corresponding kv:

<MyLayout>
    cols: 1
    Button:
        text: "Button1"
    Button:
        text: "Button2"
  • Related