【问题标题】:kivy NumericProperty to StringPropertykivy NumericProperty 到 StringProperty
【发布时间】:2015-02-17 14:03:16
【问题描述】:

我尝试用 kivy 制作自己的 Coockie Clicker,但使用的是圣诞饼干。 我创建了一个 Coockie 的图像,您可以单击它和一个标签,显示您单击了多少次。 Label 需要一个字符串,所以我尝试将数字属性转换为字符串,但没有成功,因为我收到了错误消息:

<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()

【问题讨论】:

  • 错误消息是

标签: python properties kivy


【解决方案1】:

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

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

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

当您在方法中访问它们时,例如使用self.count,您会得到一个特定于实例的结果,其行为类似于普通的非属性属性,即使它实际上是一个属性对象,因为属性在内部负责返回正确的东西(我认为说它是descriptor 是对的。

这里发生的情况是,当它没有有任何特殊行为时,您正在类级别访问结果 - 您要求str(count),这就是您得到的,字符串标识属性对象。

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

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)

通过设置__init__ 中的值,您可以获得正确的实例级行为。你也可以通过访问 count.defaultvalue 来获取它的实际值,但这可能是个坏主意。

如果您希望 txt 被 绑定 到 count 的值(自动更改为跟踪 str(count)),您必须再次执行更多操作,但我不清楚这是否是您的意图所以我就不赘述了,反正你可以查文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多