如何每秒更新画布?

我正在尝试创建一个带有 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()


慕尼黑8549860
浏览 154回答 2
2回答

函数式编程

您必须使用Clock.schedule_interval()来更新绘画,但您必须重用它们而不是创建新的 Lines 以节省资源:from kivy.app import Appfrom kivy.graphics import Color, Linefrom kivy.uix.floatlayout import FloatLayoutfrom kivy.clock import Clockfrom datetime import datetimeclass 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, secondAngleclass mainApp(App):    def build(self):        return drawClock()if __name__ == '__main__':    mainApp().run()

慕妹3242003

使用update()方法。这是一种粗略的方法,但它会给你你想要的。update 方法基本上更新窗口。一种更有效的方法是使用该after()方法。after 基本上告诉了之后要做什么,所以弄清楚。window.after(delay_ms, callback=None, *args)这些是 的参数after()。例如,这将是等待一秒钟然后执行 func upwindow.after(1000, up)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python