Python 在画布中使用属性会导致TypeError:*:';的操作数类型不受支持;int';和';非类型';

Python 在画布中使用属性会导致TypeError:*:';的操作数类型不受支持;int';和';非类型';,python,kivy,kivy-language,Python,Kivy,Kivy Language,我正在尝试实现我自己的ProgressBar*小部件 from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder kv = """ <MyProgressBar@Widget>: max: 1 value: 0 limited_value: min(self.value, self.max) # Filled ratio

我正在尝试实现我自己的ProgressBar*小部件

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

kv = """
<MyProgressBar@Widget>:
    max: 1
    value: 0
    limited_value: min(self.value, self.max)
    # Filled ratio should never be 0 or 1
    # otherwise it would cause size_hints equal to 0,
    # that is, None-type value, resulting in ignoring size_hint
    filled_ratio: max(.00001, min(.9999, float(self.value) / self.max))
    empty_ratio: 1-self.filled_ratio
    filled_color: 0,1,0,1
    empty_color: .6,.6,.6,.4

    size_hint_y: .5
    pos_hint: {'center_x': .5, 'center_y': .5}
    canvas.before:
        Color:
            rgba: root.filled_color
        Rectangle:
            size: root.width * root.filled_ratio, root.height
            pos: root.pos
        Color:
            rgba: root.empty_color
        Rectangle:
            size: root.width * root.empty_ratio, root.height
            pos: root.x + root.width*root.filled_ratio, root.y

<MainWidget>:
    MyProgressBar

"""
Builder.load_string(kv)

class MainWidget(BoxLayout):
    pass

class MySimpleApp(App):
    def build(self):
        main = MainWidget(orientation='vertical')
        return main

if __name__ == '__main__':
    MySimpleApp().run()
。。我使用:

filled_ratio: .4
empty_ratio: .6
我做错了什么


*Kivy已经有了一个

在kv语言中使用属性之前,只需在python中定义属性即可解决此问题:

class MyProgressBar(Widget):
    filled_ratio = NumericProperty(0)
    empty_ratio = NumericProperty(0)

(注:我不认为这是一个完整的答案,因为它不能解释为什么会发生这种情况。可以自由地创建一个完全解决这个问题的答案)

在使用KV语言之前,简单地定义Python中的属性:
class MyProgressBar(Widget):
    filled_ratio = NumericProperty(0)
    empty_ratio = NumericProperty(0)

< P>(注:我不认为这是一个完整的答案,因为它不能解释为什么会发生这种情况。请自由地创建一个完整地回答这个问题的答案)

你是否尝试打破了一个计算出FieldySub的表达式,并看它是否正确评估了?如果我只将
填充率:
更改为
.4
我在画布中调用它时,在使用它的下一个属性上仍然会得到相同的错误,即
空填充率
。您是否尝试将计算填充率的表达式本身分解,并查看其计算是否正确?@PaulRooney Yes。如果我只将
填充比率:
更改为
.4
在画布中调用时,我仍然会在使用它的下一个属性上得到相同的错误,即
空\u比率
。在kv中引入“新”属性时,该属性将是ObjectProperty(默认为
)(请参阅)。我不知道为什么它采用默认值而不是实际值。当定义为NumericProperty时,默认值为0,不会引发错误。当在kv中引入“新”属性时,该属性将是ObjectProperty(默认值为
None
)(请参阅)。我不知道为什么它采用默认值而不是实际值。当定义为NumericProperty时,默认值为0,不会引发错误。
class MyProgressBar(Widget):
    filled_ratio = NumericProperty(0)
    empty_ratio = NumericProperty(0)