How To Update Canvas Every Second?

user10414511

I am trying to create a clock with 3 arcs, one for hours, minutes, and seconds. The app currently draws each of the arcs, with different colors and radii as expected. The arcs also fill according to the time at application launch. The red arc represents hours, the green arc represents minutes, and the blue arc represents seconds. From here, I am trying to update the canvas so that the arcs change according to the time (once every second). I would also like a label that displays the time in the center of the clock. Can anyone help me with this problem? I am relatively new to Kivy so I'm not really sure what I should be doing.

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

You have to use the Clock.schedule_interval() to update the painting, but instead of creating new Lines you must reuse them so you save resources:

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

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related