Python 在画布中使用属性会导致TypeError:*:';的操作数类型不受支持;int';和';非类型';
我正在尝试实现我自己的ProgressBar*小部件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
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)