为了账号安全,请及时绑定邮箱和手机立即绑定

如何每秒更新画布?

如何每秒更新画布?

慕尼黑8549860 2021-12-17 14:39:56
我正在尝试创建一个带有 3 个弧的时钟,一个用于小时、分钟和秒。该应用程序当前绘制每条弧线,按预期使用不同的颜色和半径。弧线还根据应用程序启动的时间填充。红色圆弧代表小时,绿色圆弧代表分钟,蓝色圆弧代表秒。从这里开始,我试图更新画布,以便弧线根据时间变化(每秒一次)。我还想要一个在时钟中心显示时间的标签。谁能帮我解决这个问题?我对 Kivy 比较陌生,所以我不确定我应该做什么。from kivy.app import Appfrom kivy.uix.widget import Widgetfrom kivy.graphics import Color, Linefrom kivy.uix.floatlayout import FloatLayoutfrom kivy.clock import Clockfrom datetime import datetime# update canvas every second# display time in center of clockclass 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 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

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


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


查看完整回答
反对 回复 2021-12-17
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

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

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

after 基本上告诉了之后要做什么,所以弄清楚。

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

这些是 的参数after()

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

window.after(1000, up)


查看完整回答
反对 回复 2021-12-17
  • 2 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信