Skip to content
Advertisement

Display Kivy canvas inside GridLayout

I am trying to reference to Canvas within GridLayout with just drawing simple rectangle before further development. Code:

main.py:

import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.graphics.vertex_instructions import Rectangle
from kivy.graphics.context_instructions import Color

class Grafika(Widget):
    def __init__(self, **kwargs):
        super(Grafika,self).__init__(**kwargs)
        with self.canvas:
            Color(1, 0, 0, 1)
            Rectangle(pos=self.pos,size=self.size)

kv=Builder.load_file("my.kv")

class MyMainApp(App):
    def build(self):
        return kv

if __name__ == "__main__":
    MyMainApp().run()

my.py

<TextInput>:
    font_size:20
    color: 0.3, 0.6,0.7,1
    size_hint: (0.3,0.5)
<Button>:
    font_size:20
    color: 0.3, 0.6,0.7,1
    size_hint: (0.3,0.3)


Grafika:
    GridLayout:
        cols:2
        GridLayout:
            size_hint: (0.3,0.2)
            cols:1
            GridLayout:
                cols:2
                Label:
                    text:"no"
                TextInput:
                    text: "50"
                Label:
                    text:"rbr"
                TextInput:
                    text: "100"
            Button:
                text:"calc"
        canvas:
            Color:
                rbg:1, 1, 1, 1
            Rectangle:
                pos:self.pos
                size:self.size

After running i get error:

...
     27:            Button:
     28:                text:"calc"
>>   29:        canvas:
     30:            Color:
     31:                rbg:1, 1, 1, 1
...
Canvas instructions added in kv must be declared before child widgets.

I am new in kivy, so any help is appreciated.

After solving this issue, I am planning to run custom python func , run under button calc, and return calculated results on canvas. Func results are 2d line points, hence plotting of results on canvas is goal here.

Advertisement

Answer

Change:

Grafika:
    GridLayout:
        cols:2
        GridLayout:
            size_hint: (0.3,0.2)
            cols:1
            GridLayout:
                cols:2
                Label:
                    text:"no"
                TextInput:
                    text: "50"
                Label:
                    text:"rbr"
                TextInput:
                    text: "100"
            Button:
                text:"calc"
        canvas:
            Color:
                rbg:1, 1, 1, 1
            Rectangle:
                pos:self.pos
                size:self.size

to:

Grafika:
    GridLayout:
        cols:2
        canvas:
            Color:
                rbg:1, 1, 1, 1
            Rectangle:
                pos:self.pos
                size:self.size
        GridLayout:
            size_hint: (0.3,0.2)
            cols:1
            GridLayout:
                cols:2
                Label:
                    text:"no"
                TextInput:
                    text: "50"
                Label:
                    text:"rbr"
                TextInput:
                    text: "100"
            Button:
                text:"calc"

to put the canvas: instruction before the children.

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement