调用 on_pause 时暂停计时器似乎不起作用 (Kivy)

Pausing timer when on_pause is called doesnt seem to work (Kivy)

在 Android 上,我试图在调用 on_pause 时暂停我的 update_time 方法,并在调用时恢复它 on_resume 被调用。 换句话说,我试图在应用程序最小化时暂停计时器,并在应用程序最小化时恢复它 恢复。 我知道时钟在后台保持 运行,但我无法弄清楚 为什么代码不起作用。看起来检查“if self.sw_started==True”被忽略或“self.sw_started”永远不会变为 False。 例如:我打开应用程序,它开始 counting.Then 我将其最小化并等待几秒钟。 当我恢复它时,它不会从原来的位置继续,这正是我正在寻找的行为。

非常感谢您抽出宝贵的时间,抱歉我的英语不好!

from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock


class MainApp(App):
    def build(self):
        self.sw_started = False
        self.sw_seconds = 0
        #self.tmp_sw_seconds = 0 #this way doesnt work either
        Clock.schedule_interval(self.update_time, 1)

        self.lbl=Label(text="0")
        return self.lbl

    def on_start(self):
        self.start_timer()

    def update_time(self, nap):
        if self.sw_started==True:
            self.sw_seconds += nap
            print(round(self.sw_seconds))
            self.lbl.text=str(round(self.sw_seconds))

    def reset_timer(self):
        self.sw_started = False
        self.sw_seconds = 0

    def start_timer(self):
        self.sw_started = True

    def stop_timer(self):
        self.sw_started=False

    def on_pause(self):
        self.stop_timer()
        # self.tmp_sw_seconds = self.sw_seconds #this way doesnt work either
        print("timer paused")
        return True

    def on_resume(self):
        # self.sw_seconds = self.tmp_sw_seconds #this way doesnt work either
        self.start_timer()
        print("timer resumed")

        pass
MainApp().run()

您可以将 sw_started 更改为 sw_started = BooleanProperty(False)。这将使您能够在其值(此处为 bool)发生变化时观察其 current-state。

接下来,要实现它,您可以将其绑定到任何所需的回调方法或仅使用 on_prop 方法。

因此,您更新后的代码现在应该如下所示,

from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.properties import BooleanProperty


class MainApp(App):
    sw_started = BooleanProperty(False)
    
    def on_sw_started(self, *args):
        # This will call meth. update_time whenever attr. sw_started changes.
        self.update_time(args)
    
    def build(self):
        self.frequency = 1.0
#        self.bind(sw_started = self.update_time)
        self.sw_seconds = 0
        #self.tmp_sw_seconds = 0 #this way doesnt work either
        Clock.schedule_interval(self.update_time, self.frequency)

        self.lbl=Label(text="0")
        return self.lbl

    def on_start(self):
        self.sw_started = True
#        self.start_timer()

    def update_time(self, *args):
        if self.sw_started:
#        if self.sw_started==True:
            self.sw_seconds += self.frequency
            print(int(self.sw_seconds))
            self.lbl.text=str(int(self.sw_seconds))

    def reset_timer(self):
        self.sw_started = False
        self.sw_seconds = 0

#    def start_timer(self):
#        self.sw_started = True

#    def stop_timer(self):
#        self.sw_started=False

    def on_pause(self):
        self.sw_started = False
#        self.stop_timer()
        # self.tmp_sw_seconds = self.sw_seconds #this way doesnt work either
        print("timer paused")
        return True

    def on_resume(self):
        # self.sw_seconds = self.tmp_sw_seconds #this way doesnt work either
#        self.start_timer()
        print("timer resumed")
        self.sw_started = True

#        pass
MainApp().run()