Cid*_*-El 3 python time datetime kivy
所以我想构建一个 kivy 程序,它基本上只是倒计时特定的分钟和秒。
这是我走了多远:
from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock
from datetime import datetime, date, time
class IncrediblyCrudeClock(Label):
a = time(0, 1, 1)
def update(self, *args):
self.text = str(self.a)
print(str(self.a))
self.a = datetime.combine(date.today(), self.a) - datetime.combine(date.today(), time(0,0,1))
class TimeApp(App):
def build(self):
crudeclock = IncrediblyCrudeClock()
Clock.schedule_interval(crudeclock.update, 1)
return crudeclock
if __name__ == "__main__":
TimeApp().run()
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试从新时间中扣除旧时间时,显示的时间减少了 1 秒,出现以下错误:
self.a = datetime.combine(date.today(), self.a) datetime.combine(date.today(), time(0,0,1))
TypeError: combine() argument 2 must be datetime.time, not datetime.timedelta
Run Code Online (Sandbox Code Playgroud)
这让我觉得,在第一次 sustraction 之后, a 现在不再是“时间”对象,而是不幸无法扣除的“时间增量”。
任何帮助都会很棒!
如果您只需要倒计时,还有一种更简单的方法。您可以使用 kivy 的Animation课程,@inclement 在youtube 上对此进行了很好的描述。所以这是代码(main.py 和 time.kv):
主文件
from kivy.app import App
from kivy.uix.label import Label
from kivy.animation import Animation
from kivy.properties import StringProperty, NumericProperty
class IncrediblyCrudeClock(Label):
a = NumericProperty(5) # seconds
def start(self):
Animation.cancel_all(self) # stop any current animations
self.anim = Animation(a=0, duration=self.a)
def finish_callback(animation, incr_crude_clock):
incr_crude_clock.text = "FINISHED"
self.anim.bind(on_complete=finish_callback)
self.anim.start(self)
class TimeApp(App):
def build(self):
crudeclock = IncrediblyCrudeClock()
crudeclock.start()
return crudeclock
if __name__ == "__main__":
TimeApp().run()
Run Code Online (Sandbox Code Playgroud)
时间.kv
<IncrediblyCrudeClock>
text: str(round(self.a, 1))
Run Code Online (Sandbox Code Playgroud)
享受!:)
OP 要求一个没有 kv 文件的解决方案——所以这里是一个:
from kivy.app import App
from kivy.uix.label import Label
from kivy.animation import Animation
from kivy.properties import StringProperty, NumericProperty
class IncrediblyCrudeClock(Label):
a = NumericProperty(5) # seconds
def start(self):
Animation.cancel_all(self) # stop any current animations
self.anim = Animation(a=0, duration=self.a)
def finish_callback(animation, incr_crude_clock):
incr_crude_clock.text = "FINISHED"
self.anim.bind(on_complete=finish_callback)
self.anim.start(self)
def on_a(self, instance, value):
self.text = str(round(value, 1))
class TimeApp(App):
def build(self):
crudeclock = IncrediblyCrudeClock()
crudeclock.start()
return crudeclock
if __name__ == "__main__":
TimeApp().run()
Run Code Online (Sandbox Code Playgroud)