我尝试的是一个更大的应用程序的一部分,但我在这里发布了最低限度来理解我的问题:
我想改变矩形的大小,这个大小取决于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)
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)
答案 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()