我正在制作一个简单的秒表。问题在于秒表会在您运行程序时自动运行,即使您按下停止按钮也无法使其停止运行。
class ClockApp(App):
sw_started = False
sw_seconds = 0
def update_clock(self, nap):
if self.sw_started:
self.sw_seconds += nap
def update_time(self, nap):
self.root.ids.time.text = strftime('[b]%H[/b]:%M:%S')
self.sw_seconds += nap
minutes, seconds = divmod(self.sw_seconds, 60)
self.root.ids.stopwatch.text = ('%02d:%02d.[size=40]%02d[/size]' % (int(minutes), int(seconds),
int(seconds * 100 % 100)))
def start_stop(self):
self.root.ids.start_stop.text = ('Start'
if self.sw_started else 'Stop')
self.sw_started = not self.sw_started
def reset(self):
if self.sw_started:
self.root.ids.start_stop.text = 'Start'
self.sw_started = False
self.sw_seconds = 0
def on_start(self):
Clock.schedule_interval(self.update_time, 0)
class ClockLayout(BoxLayout):
time_prop = ObjectProperty(None)
if __name__ == '__main__':
LabelBase.register(name='Roboto', fn_regular='Roboto-Thin.ttf', fn_bold='Roboto-Medium.ttf')
Window.clearcolor = get_color_from_hex('#101216')
ClockApp().run()
答案 0 :(得分:1)
您的计时方法有两种不同的重复方式:
def update_clock(self, nap):
if self.sw_started:
self.sw_seconds += nap # here
def update_time(self, nap):
self.root.ids.time.text = strftime('[b]%H[/b]:%M:%S')
self.sw_seconds += nap # and here
# [...]
update_clock
仅在sw_started
为True
的情况下递增计数,但是update_time
没有这样的校验。您通过schedule_interval
安排的方法是update_time
,因此sw_started
的值无效。
改为排定update_clock
:
def on_start(self):
Clock.schedule_interval(self.update_clock, 0)
...或向update_time
添加一个条件:
def update_time(self, nap):
if self.sw_started:
self.root.ids.time.text = strftime('[b]%H[/b]:%M:%S')
self.sw_seconds += nap
minutes, seconds = divmod(self.sw_seconds, 60)
# [...]