python - 如何每秒更新 Canvas?
问题描述
我正在尝试创建一个具有 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()
解决方案
使用update()
方法。这是一种粗略的方式,但它会给你你想要的。update 方法基本上是更新窗口。
一种更有效的方法是使用该after()
方法。
after 基本上告诉了之后要做什么,所以弄清楚。
window.after(delay_ms, callback=None, *args)
这些是after()
.
例如,这将是等待一秒钟然后执行 funcup
window.after(1000, up)
推荐阅读
- postgresql - 是否可以将 Hibernate 配置为仅刷新但从不提交(一种提交模拟)
- reactjs - 使用 Reactn 和 Typescript 进行私有路由身份验证
- c++ - 为什么我在 for 循环中创建的值在循环体内不起作用?
- mysql - COUNT WHERE 在同一列中同时满足两个条件
- java - 通过蓝牙接收的消息在android应用程序中拆分
- c++ - 使用 consteval 代替 constexpr 函数有什么好处?
- javascript - 带有克隆字段和行总计的表单,总计不完整
- exception - 异常不再被捕获
- c++ - 在 C++ 中获取整数数组的所有可能组合
- python - 更改 Pandas 数据框的日期类型