【问题标题】:How To Update Canvas Every Second?如何每秒更新 Canvas?
【发布时间】:2019-03-27 11:33:48
【问题描述】:

我正在尝试创建一个具有 3 个弧线的时钟,一个用于小时、分钟和秒。该应用程序当前绘制了每条弧线,并按预期使用不同的颜色和半径。弧线也根据应用程序启动的时间填充。红色弧线代表小时,绿色弧线代表分钟,蓝色弧线代表秒。从这里开始,我正在尝试更新画布,以便弧线根据时间变化(每秒一次)。我还想要一个在时钟中心显示时间的标签。谁能帮我解决这个问题?我对 Kivy 比较陌生,所以我不确定我应该做什么。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Line
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock
from datetime import datetime

# update canvas every second
# display time in center of clock
class drawClock(FloatLayout):

    def __init__(self, **kwargs):
        super(drawClock, self).__init__(**kwargs)
        self.bind(pos=self.updateClock)
        self.bind(size=self.updateClock)

    def updateClock(self, *kwargs):
        with self.canvas:
            now = datetime.now()
            hour = now.hour
            minute = now.minute
            second = now.second
            hourAngle = (hour%12) * 30
            minuteAngle = minute * 6
            secondAngle = second * 6
            Line(circle = (self.center_x, self.center_y, 80, 0, hourAngle), width = 2, color = Color(1,0,0))
            Line(circle = (self.center_x, self.center_y, 65, 0, minuteAngle), width = 2, color = Color(0,1,0))
            Line(circle = (self.center_x, self.center_y, 50, 0, secondAngle), width = 2, color = Color(0,0,1))

class mainApp(App):
    def build(self):
        return drawClock()

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

【问题讨论】:

    标签: python python-3.x kivy


    【解决方案1】:

    您必须使用Clock.schedule_interval() 来更新绘画,但您必须重复使用它们而不是创建新线条,以节省资源:

    from kivy.app import App
    from kivy.graphics import Color, Line
    from kivy.uix.floatlayout import FloatLayout
    from kivy.clock import Clock
    from datetime import datetime
    
    class drawClock(FloatLayout):
        def __init__(self, **kwargs):
            super(drawClock, self).__init__(**kwargs)
            self.bind(pos=self.updateClock)
            self.bind(size=self.updateClock)
            Clock.schedule_interval(self.updateClock, 1)
            self.create_canvas()
    
        def create_canvas(self):
            with self.canvas:
                self.hour_line = Line(width = 2, color = Color(1,0,0))
                self.minute_line =  Line(width = 2, color = Color(0,1,0))
                self.second_line = Line(width = 2, color = Color(0,0,1))
    
        def updateClock(self, *kwargs):
            now = datetime.now()
            hour = now.hour
            minute = now.minute
            second = now.second
            hourAngle = (hour%12) * 30
            minuteAngle = minute * 6
            secondAngle = second * 6
            self.hour_line.circle = self.center_x, self.center_y, 80, 0, hourAngle
            self.minute_line.circle = self.center_x, self.center_y, 65, 0, minuteAngle
            self.second_line.circle = self.center_x, self.center_y, 50, 0, secondAngle
    
    
    class mainApp(App):
        def build(self):
            return drawClock()
    
    if __name__ == '__main__':
        mainApp().run()
    

    【讨论】:

      【解决方案2】:

      使用update() 方法。这是一种粗略的方式,但它会给你你想要的。 update 方法基本上是更新窗口。

      更有效的方法是使用after() 方法。

      after 基本上说明了之后要做什么,所以想清楚。

      window.after(delay_ms, callback=None, *args)

      这些是after() 的参数。

      例如,这将是等待一秒钟然后执行 func up

      window.after(1000, up)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-23
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 1970-01-01
        • 2016-09-19
        相关资源
        最近更新 更多