kivy NumericProperty到StringProperty

时间:2014-12-18 17:33:43

标签: python properties kivy

我试图在kivy制作我自己的Coockie Clicker,但是用cristmas coockies。 我创建了一个Coockie的图像,您可以单击并显示一个标签,显示您单击了多少次。 Label需要一个String,所以我尝试将numeric属性转换为字符串,但它不起作用,因为我收到了错误消息:

<kivy.properties.NumericProperty object at 0xa6e32cc>

这是代码的一部分,我怀疑错误:

class Kecks(Widget):

    count = NumericProperty(0)
    amount = NumericProperty(1)
    txt = StringProperty(str(count))

以下是代码的其余部分:

from kivy.app import App
from kivy.lang import Builder

from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.core.window import Window

from kivy.clock import Clock
from kivy.animation import Animation
from  kivy.core.text.markup import *

from kivy.uix.floatlayout import FloatLayout
from kivy.properties import NumericProperty
from kivy.properties import StringProperty

Builder.load_string('''
<Root>:

    Kecks:
        pos: 300, 300
<Kecks>:
    Image:
        pos: root.pos
        id: my_image
        source: 'piernik.png'

    Label:
        id: my_Label
        font_size: 50
        text: root.txt
        center_x: root.width / 4

''')

class Root(FloatLayout):
    pass

class Kecks(Widget):

    count = NumericProperty(0)
    amount = NumericProperty(1)
    txt = StringProperty(str(count))

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            self.count += self.amount
            print self.txt


class app(App):
    def build(self):
        Window.clearcolor = (10, 0, 0, 1)
        return Root()

if __name__ == "__main__":
    app().run()

1 个答案:

答案 0 :(得分:2)

这不是错误消息,它是标识属性实例的字符串。你真的是说你有错误,或者你的程序打印的是什么?我猜后者,因为......

count = NumericProperty(0)
amount = NumericProperty(1)
txt = StringProperty(str(count)) 

要理解这一点,您需要了解一些属性如何工作 - 您在级别而不是在方法中声明它们,因此它们是类的属性(继承为个别实例的属性)。这样做的一个结果是该类的所有实例共享相同的属性对象。

在方法中访问它们时,例如使用self.count,您将获得一个特定于实例的结果,其行为类似于普通的非属性属性,即使它实际上是一个属性对象,因为该属性在内部处理回复正确的事情(我认为这是正确的说法&#39; sa descriptor)。

这里发生的事情是您在课堂级别访问结果,当没有& 有任何特殊行为时 - 您要求{{1}那就是你得到的,标识属性对象的字符串。

解决此问题的正确pythonic方法可能是

str(count)

通过设置class Kecks(Widget): count = NumericProperty(0) amount = NumericProperty(1) txt = StringProperty() def __init__(self, *args, **kwargs): super(Kecks, self).__init__(*args, **kwargs): self.txt = str(self.count) 中的值,您可以获得正确的实例级行为。您还可以通过访问count.defaultvalue来获取其实际值,但这可能是一个坏主意。

如果你想让txt 绑定到count的值(自动改为跟踪str(count)),你必须再做一次,但是我不清楚是否& #39;你的意图,所以我不会进入它,你可以检查文档。