如果这是我在如此短的时间内的第二篇文章,我很抱歉,但我不明白发生了什么。
到目前为止,这是我的代码:
def countdown(self, remaining = None):
hours = int(self.hour.get())
minutes = int(self.minutes.get())
seconds = int(self.seconds.get())
if seconds == 0:
if minutes != 0:
seconds += 59
minutes -= 1
elif minutes == 0:
if hours != 0:
minutes += 59
seconds += 59
hours -= 1
else:
self.timerLab.configure(text="Times Up!")
else:
self.timerLab.configure(text="Time Remaining: %d:%d:%d " % (hours,minutes,seconds))
seconds -= 1
self.after(1000, self.countdown)
所以这是我到目前为止的倒数计时器,我不明白为什么秒不更新。就我的逻辑而言,如果秒 - = 1那么它应该采取一个,并且当它继续循环它应该更新。我是对的,还是我只是完全愚蠢而且错过了显而易见的事情?
如果需要更多代码,请询问。
答案 0 :(得分:2)
在函数结束时调用seconds -= 1
不会执行任何操作,因为您在下次调用倒数计时器中的值时重置它。所以你基本上每次都将倒数计时器设置为完全相同的东西。将该行移到上方
self.timerLab.configure(text="Time Remaining: %d:%d:%d " % (hours,minutes,seconds))
看看会发生什么。
答案 1 :(得分:1)
这里有一些问题:
Entry
小部件获得相同的值时。after
仅在else
块中调用,因此当seconds == 0
时,它不会再次执行该方法。remaining
始终为None,因为您在不传递参数的情况下使用对函数的引用。对于最后一个问题,快速解决方案是将最后一个语句更改为self.after(1000, lambda: self.countdown(remaining))
,但有一个更好的解决方案:
after
调用,并在那里递减用于表示剩余秒数的变量。divmod()
轻松将秒数转换为"h:m:s"
格式。最终结果可能如下所示:
def start_countdown(self):
hours = int(self.hour.get())
minutes = int(self.minutes.get())
seconds = int(self.seconds.get())
self.remaining = hours * 3600 + minutes * 60 + seconds
self.countdown()
def countdown(self):
if self.remaining == 0:
self.timerLab.configure(text="Times Up!")
else:
m, s = divmod(self.remaining, 60)
h, m = divmod(m, 60)
self.timerLab.configure(text="Time Remaining: %d:%d:%d " % (h, m, s))
self.remaining -= 1
self.master.after(1000, self.countdown)