我不确定问题标题是否合适,我的问题是当我使用 Kivy Clock.schedule.interval(callback, 0) 运行时间倒计时代码时,在完成时间倒计时后的回调函数中,它可能不会显示新的设置倒计时值。我的代码如下步骤
我的问题是为什么在延迟持续时间内标签总是将其值(文本)显示为零,我应该已经将倒计时值重置为其初始值。
我的代码如下, 在 .py 文件中
from kivy.app import App
from kivy.clock import Clock
from kivy.properties import ObjectProperty
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.boxlayout import BoxLayout
from time import strftime
class Test(TabbedPanel):
pass
class ClockTest(BoxLayout):
time_str = ObjectProperty()
tm_interval = 5 # 5 seconds
tm_flag = True
tm = tm_interval
def __init__(self, **kwargs):
super(ClockTest, self).__init__(**kwargs)
Clock.schedule_interval(self.cb, 0)
def cb(self, dt):
if self.tm_flag:
self.tm -= dt
if self.tm <= 0:
self.tm = self.tm_interval
print('tm: ', self.tm)
m, s = divmod(self.tm, 60)
self.time_str.text = ('%02d:%02d.%02d' %
(int(m), int(s), int(s * 100 % 100)))
print('time_str: ',self.time_str.text)
# loop: for time delay
for x in range(100000):
text = strftime('[b]%H[/b]:%M:%S')
m, s = divmod(self.tm, 60)
self.time_str.text = ('%02d:%02d.%02d' %
(int(m), int(s), int(s * 100 % 100)))
class ClockTest1App(App):
def build(self):
tm_obj = Test()
return tm_obj
if __name__ == '__main__':
ClockTest1App().run()
在.kv文件中
#:kivy 2.1.0
Test:
<ClockTest>:
time_str: time_str
orientation: 'vertical'
Label:
id: time_str
font_size: 40
bold: True
text: time_str.text
<Test>:
do_default_tab: False
TabbedPanelItem:
text: 'ClockTest'
font_size: 15
ClockTest:
代码中不应该有逻辑问题,我不知道问题出在哪里,请帮我解决,谢谢!
另一个问题是如何改进时间延迟代码,如果使用时间睡眠它会阻塞代码并显示黑屏。
其实这个问题我有两个问题:
现在我可以解决第二个问题了,但我仍然不知道为什么'for循环'延迟代码不起作用。
为了再次显示时间倒计时之前的时间段内的重置时间值,我更新了 .py 文件如下,
from kivy.app import App
from kivy.clock import Clock
from kivy.properties import ObjectProperty
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.boxlayout import BoxLayout
from time import strftime
class Test(TabbedPanel):
pass
class ClockTest(BoxLayout):
time_str = ObjectProperty()
tm_interval = 5 # 5 seconds
tm_flag = True
tm = tm_interval
def __init__(self, **kwargs):
super(ClockTest, self).__init__(**kwargs)
Clock.schedule_interval(self.cb, 0)
def delayset(self, cb, dt):
Clock.schedule_once(cb, dt)
def delaycb(self, dt):
self.tm_flag = True
def cb(self, dt):
if self.tm_flag:
self.tm -= dt
if self.tm <= 0:
self.tm = self.tm_interval
print('tm: ', self.tm)
self.tm_flag = False
self.delayset(self.delaycb, 3)
m, s = divmod(self.tm, 60)
self.time_str.text = ('%02d:%02d.%02d' %
(int(m), int(s), int(s * 100 % 100)))
class ClockTest1App(App):
def build(self):
tm_obj = Test()
return tm_obj
if __name__ == '__main__':
ClockTest1App().run()