首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kivy倒计时动画平滑与同步

问kivy倒计时动画平滑与同步
EN

Stack Overflow用户
提问于 2017-12-01 09:14:09
回答 2查看 1.5K关注 0票数 1

​

​

我在基维设计了这个倒计时动画。它有两个问题:

  • 圆圈动画与数字不同步
  • 圆圈动画不光滑

我非常希望有任何建议来解决这两个问题。谢谢

这是代码(py)

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.properties import NumericProperty


class CountDownLbl(Label):
    angle = NumericProperty(0)
    startCount = NumericProperty(20)
    Count = NumericProperty()
    def __init__(self, **kwargs):
        super(CountDownLbl, self).__init__(**kwargs)
        Clock.schedule_once(self.set_Circle, 0.1)
        self.Count = self.startCount
        Clock.schedule_interval(lambda x: self.set_Count(), 1)

    def set_Circle(self, dt):
        self.angle = self.angle + dt*360
        if self.angle >= 360:
            self.angle = 0
        Clock.schedule_once(self.set_Circle, 0.1)

    def set_Count(self):
        self.Count = self.Count - 1


class PhotoBoothApp(App):
    pass

if __name__ == '__main__':
    try:
        app = PhotoBoothApp()
        app.run()
    except KeyboardInterrupt:
        app.stop()

(kv)

代码语言:javascript
复制
CountDownLbl:
    text: str(self.Count)
    font_size: 30
    canvas:
        Color:
            rgb: 1,0,1
        Line:
            circle:self.center_x, self.center_y, 90, 0, self.angle
            width: 5
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-01 12:24:47

将间隔改为1.0/360

代码语言:javascript
复制
Clock.schedule_once(self.set_Circle, 1.0/360)

你也可以这样写:

代码语言:javascript
复制
class CountDownLbl(Label):

    angle = NumericProperty(0)
    startCount = NumericProperty(20)
    Count = NumericProperty()

    def __init__(self, **kwargs):
        super(CountDownLbl, self).__init__(**kwargs)
        Clock.schedule_once(self.set_Circle, 0.1)
        self.Count = self.startCount

    def set_Circle(self, dt):
        self.angle = self.angle + dt*360
        if self.angle >= 360:
            self.angle = 0
            self.Count = self.Count - 1
        if self.Count > 0:
            Clock.schedule_once(self.set_Circle, 1.0/360)

​

​

票数 1
EN

Stack Overflow用户

发布于 2017-12-01 18:09:58

您可以使用Animation,然后使用数学:

main.py:

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import NumericProperty
from kivy.animation import Animation

class RootWidget(BoxLayout):
    pass

class CountDownLbl(Label):
    startCount = NumericProperty(10)
    angle = NumericProperty(0)

    def start(self):
        Animation.cancel_all(self)
        self.anim = Animation(angle=360 * self.startCount - 1,  duration=self.startCount)
        self.anim.bind(on_complete=self.finish)
        self.anim.start(self)

    def finish(self, animation, incr_crude_clock):
        incr_crude_clock.text = "FINISHED"


class TestApp(App):
    def build(self):
        return RootWidget()

if __name__ == '__main__':
    TestApp().run()

test.kv:

代码语言:javascript
复制
<RootWidget>:
    orientation: "vertical"
    CountDownLbl:
        id: anim_label
        text: str(int(self.startCount - self.angle // 360))
        font_size: 30
        canvas:
            Color:
                rgb: 1,0,1
            Line:
                circle:self.center_x, self.center_y, 90, 0, self.angle % 360
                width: 5
    Button:
        size_hint_y: 0.1
        text: "Start"
        on_press: anim_label.start()

输出:

​

​

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47590043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档