Kivy Clock.schedule.interval()的callback()执行问题

问题描述 投票:0回答:1

我不确定问题标题是否合适,我的问题是当我使用 Kivy Clock.schedule.interval(callback, 0) 运行时间倒计时代码时,在完成时间倒计时后的回调函数中,它可能不会显示新的设置倒计时值。我的代码如下步骤

  1. 每次回调运行时,倒计时值(tm)都会减少dt(从Clock.schedule.interval()获取)
  2. 当倒计时值等于小于零时(tm<=0), then reset the countdown value to the initial value
  3. 要检查重置倒计时值,我使用 print() 来显示倒计时值,它显示了正确的值
  4. 要设置 ObjectProperty,请将倒计时值传递到 .kv 文件并在标签中显示倒计时值
  5. 倒计时完成之前,标签始终显示正确的倒计时值。
  6. 倒计时完成后会将倒计时值重置为初始值,在重新开始倒计时之前,我使用for循环来延迟倒计时重新开始
  7. 在延迟时间内,标签始终显示倒计时值为零

我的问题是为什么在延迟持续时间内标签总是将其值(文本)显示为零,我应该已经将倒计时值重置为其初始值。

我的代码如下, 在 .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:

代码中不应该有逻辑问题,我不知道问题出在哪里,请帮我解决,谢谢!

另一个问题是如何改进时间延迟代码,如果使用时间睡眠它会阻塞代码并显示黑屏。

callback kivy clock
1个回答
0
投票

其实这个问题我有两个问题:

  1. 当我想使用“for循环”在短时间内显示重置时间值时,为什么在循环运行期间它总是显示最后一个时间值 - 值零(时间重置之前)?
  2. 如何再次显示倒计时之前的时间段内的重置时间值?

现在我可以解决第二个问题了,但我仍然不知道为什么'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()
© www.soinside.com 2019 - 2024. All rights reserved.