1

如果这是我在这么短的时间内第二次发帖,我很抱歉,但我不明白发生了什么。

到目前为止,这是我的代码:

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)

所以这是我到目前为止的倒数计时器,我不明白为什么秒数没有更新。就我的逻辑而言,如果 seconds -= 1 那么它应该需要 1 并且随着它继续循环它应该更新。我是对的,还是我只是完全愚蠢而错过了显而易见的事情?

如果需要更多代码,请询问。

4

2 回答 2

2

在函数结束时调用seconds -= 1不会做任何事情,因为您在下一次调用倒数计时器中的值时将其重置。所以你基本上每次都将倒数计时器设置为完全相同的东西。将那条线移到上面 self.timerLab.configure(text="Time Remaining: %d:%d:%d " % (hours,minutes,seconds))

看看会发生什么。

于 2013-03-31T07:02:13.400 回答
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)
于 2013-03-31T16:19:58.677 回答