调整主窗口大小时调整矩形的大小,而在python中更改Rectangle的大小

时间:2016-03-31 20:32:46

标签: python-3.x kivy

我尝试的是一个更大的应用程序的一部分,但我在这里发布了最低限度来理解我的问题:

我想改变矩形的大小,这个大小取决于root.height。

3例:

1)当我创建一个以“root.height / 4”为高度的矩形时,大小会随着我调整根窗口大小而变化。 到目前为止没有问题

2)当我尝试将“root.height / 4”分配给attribut并在设置矩形的大小时调用此attribut时出现以下错误: “TypeError:需要浮动”。

Python文件:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color


class BriqueApp(App):

    def build(self):
        return BriqueGUI()


class BriqueGUI(Widget):
    pass

BriqueApp().run()

Kv档案:

#:kivy 1.9.1

<BriqueGUI>:
    h: root.height/4
    color: (1,0,0,1)

    canvas:
        Color: 
            rgba: root.color
        Rectangle:
            size: (200, self.h)
            pos: (0,0)

float error

3)当我尝试重新分配一个值时,例如“root.height / 2”,当一个事件被调用时(这里是on_touch_down):我的Rectangle的大小改变但是当我调整窗口大小时我的矩形没有用它来调整大小。 您可以在此处查看加载文件,单击主窗口并更改其大小的问题。

Python文件:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color


class BriqueApp(App):

    def build(self):
        return BriqueGUI()


class BriqueGUI(Widget):

    def on_touch_down(self, touch):
        self.h = self.height/2

BriqueApp().run()

Kv档案:

#:kivy 1.9.1

<BriqueGUI>:
    h: 20
    color: (1,0,0,1)

    canvas:
        Color: 
            rgba: root.color
        Rectangle:
            size: (200, self.h)
            pos: (0,0)

1 个答案:

答案 0 :(得分:3)

2)您还必须在Python代码中创建属性:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color
from kivy.properties import NumericProperty
from kivy.lang import Builder

Builder.load_string(""" 
<BriqueGUI>:
    h: root.height/4
    color: (1,0,0,1)

    canvas:
        Color: 
            rgba: root.color
        Rectangle:
            size: (200, self.h)
            pos: (0,0)
""")

class BriqueApp(App):  
    def build(self):
        return BriqueGUI()


class BriqueGUI(Widget):
    h = NumericProperty(0.0)

BriqueApp().run()

3)您只需为您的h财产分配一次价值。您需要的是bind方法,它允许您关联将在属性更改时调用的回调:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color
from kivy.properties import NumericProperty
from kivy.lang import Builder

Builder.load_string(""" 
<BriqueGUI>:
    h: 20
    color: (1,0,0,1)

    canvas:
        Color: 
            rgba: root.color
        Rectangle:
            size: (200, self.h)
            pos: (0,0)
""")

class BriqueApp(App):

    def build(self):
        return BriqueGUI()


class BriqueGUI(Widget):

    def on_touch_down(self, touch):
        self.h = self.height/2
        self.bind(height=self.set_h)

    def set_h(self, instance, value):
        self.h = value/2

BriqueApp().run()