Tkinter文本无法显示

时间:2013-03-31 06:57:20

标签: python python-2.7 timer tkinter

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

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

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那么它应该采取一个,并且当它继续循环它应该更新。我是对的,还是我只是完全愚蠢而且错过了显而易见的事情?

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

2 个答案:

答案 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)