这是我的代码:

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


Builder.load_string('''
<Simple>:
    Label:
        text: str( root.sometext )
    Button:
        text: '+++'
        on_release: root.inc()
''')


class Simple(BoxLayout):
    sometext = NumericProperty(0)

    def __init__(self, **kwargs):
        super(Simple, self).__init__(**kwargs)

        self.sometext = 5

    def inc(self):
        self.sometext += 5 


class TApp(App):
    def build(self):
        return Simple()


TApp().run()

一切正常,每次按下按钮时标签都会更新 5。

我不会添加一些动画。喜欢:更新前的数字从左到右,更新后的数字从右到左。如果这动画很复杂,欢迎其他概念。

如何做呢 ?我查看了文档,但每个示例都带有位置,而不是文本更新(或者至少是我发现的)。

有帮助吗?

解决方案

@inclement是对的。我认为不可能直接对文本进行动画处理,但是可以对标签进行动画处理。也可以连接动画(运算符“+”)并使用该事件 on_complete 将动画放在中间,就像您正在寻找的增量一样。

这很简单,但您需要对代码进行一些更改:

  1. 您需要能够访问 Label 来自Python:

    1.1.添加一个 id 到标签:

    Label:
        id: _the_label
    

    1.2.添加一个 ObjectPropertySimple 班级:

    class Simple(BoxLayout):
        the_label = ObjectProperty(None)
    

    1.3.“连接” idObjectProperty:

    <Simple>:
       the_label: _the_label
    
  2. 确保 Label 有向左或向右移动的空间。一种方法是:

    2.1 嵌入 Label 进入另一个 Widget, , 在这种情况下 RelativeLayout:

    RelativeLayout:
       Label:
    

    2.2 定义尺寸 Label 并将其居中:

    size_hint: 0.3, 0.1
    center_x: self.parent.width/2
    center_y: self.parent.height/2
    
  3. 现在您可以继续创建动画的方法 Label:

    def animate(self):
        left = Animation(x=0, color= [0,0,0,0])
        left.bind(on_complete=self.inc)
        right = Animation(center_x=self.the_label.parent.width/2, color= [1,1,1,1])
        anim = left + right
        anim.start(self.the_label)
    
    def inc(self, instance, value):
        self.sometext += 5 
    

    注意:bind 到左边的动画 on_complete 致方法公司另请注意 anim = left + right 连接两个动画。还有运营商 * 运行并行动画。

尽管不可能直接对文本进行动画处理,但 Label 的某些属性会间接影响它。例如,字体大小、颜色等。这里有一个 完整列表. 。我确信应该有一种方法可以通过动画来破解文本的移动 padding 财产, ,如果您确实需要为文本添加动画效果。

最终代码在这里:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import NumericProperty, ObjectProperty
from kivy.animation import Animation

Builder.load_string('''
<Simple>:
    the_label: _the_label
    RelativeLayout:
        Label:
            id: _the_label
            size_hint: 0.3, 0.1
            center_x: self.parent.width/2
            center_y: self.parent.height/2
            text: str( root.sometext )
    Button:
        text: '+++'
        on_release: root.animate()
''')


class Simple(BoxLayout):
    the_label = ObjectProperty(None)
    sometext = NumericProperty(5)

    def animate(self):
        left = Animation(x=0)
        left.bind(on_complete=self.inc)
        right = Animation(center_x=self.the_label.parent.width/2)
        anim = left + right
        anim.start(self.the_label)

    def inc(self, instance, value):
        self.sometext += 5 

class TApp(App):
    def build(self):
        return Simple()

TApp().run()

其他提示

怎么办?我看了记录,但每个例子都是用帖子,而不是文本更新(或至少我找到了什么)。

kivy的动画修改特定属性,我认为在此上下文中,我认为动画文本实际上是有意义的。

它听起来可以获得您想要的行为,您真的需要添加一个或多个标签,它的位置被动画才能获得运动效果 - 即,动画类没有让你动画一个属性(文本)通过改变他人(POS),它只以一种特定方式更改一个特定属性。

如果这是动画复杂,其他概念会受到欢迎。

如果我想这样做,我实际上会看看使用两个标签的旋转木马小部件。 inc方法将更改当前隐藏标签的文本,然后调用切换当前可见窗口小部件的旋转木马方法。旋转木马已经有一个动画,其中第一个小部件在下一个幻灯片上滑落,所以它会为您提供详细信息。

这是非常具体的,但是,使用旋转木马恰好恰好适合您的特殊问题。我认为对你的问题的真实答案是你需要考虑自己添加更复杂的行为,因为它不是一个只是动画一个属性的情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top