Как обновлять холст каждую секунду? - PullRequest
2 голосов
/ 27 марта 2019

Я пытаюсь создать часы с 3 дугами, по одному для часов, минут и секунд. В настоящее время приложение рисует каждую из дуг с разными цветами и радиусами, как и ожидалось. Дуги также заполняются в зависимости от времени запуска приложения. Красная дуга представляет часы, зеленая дуга представляет минуты, а синяя дуга представляет секунды. Отсюда я пытаюсь обновить холст так, чтобы дуги менялись в зависимости от времени (раз в секунду). Я также хотел бы метку, которая отображает время в центре часов. Может кто-нибудь помочь мне с этой проблемой? Я относительно новичок в Киви, поэтому я не совсем уверен, что мне следует делать.

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

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Вы должны использовать 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()
0 голосов
/ 27 марта 2019

Используйте метод update().Это грубый способ, но он даст вам то, что вы хотите.Метод update в основном обновляет окно.

Более эффективный способ сделать это - использовать метод after().

After в основном говорит, что делать после, так что разберитесь.

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

Это параметры для after().

Например, это будет ждать одну секунду, а затем выполнять func up

window.after(1000, up)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...