在Python中改变矩形大小时调整主窗口大小时调整矩形大小

Lul*_*ntu 1 python-3.x kivy

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

我想更改矩形的大小,该大小取决于 root.height 。

3个案例:

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

2)当我尝试将“root.height/4”分配给属性并在设置矩形大小时调用此属性时,出现以下错误:“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()
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

浮动错误

3)当我尝试重新分配一个值时,例如“root.height/2”,当调用事件时(此处为on_touch_down):我的矩形的大小发生变化,但是当我调整窗口大小时,我的矩形不会调整大小用它。您可以在此处看到加载文件、单击主窗口并更改其大小的问题。

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()
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Nyk*_*kin 6

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()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)