python为已经运行的倒计时添加时间

时间:2011-07-14 03:22:36

标签: python multithreading timer countdown

我想要一个应用程序,如果我单击一个按钮,我会在运行的倒数计时器中添加X时间。

我猜我必须使用线程,但我不确定如何实现它..

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

def countdown_controller(add_time):
    end_it = False
    def timer(time_this):
        start = time.time()
        lastprinted = 0
        finish = start + time_this
        while time.time() < finish:
            now = int(time.time())
            if now != lastprinted:
                time_left = int(finish - now)
                print time_left
                lastprinted = now
            if end_it == True:
                now = finish
            time.sleep(0.1)
    # Check if the counter is running otherwise just add time.
    try:
        time_left 
    except NameError:
        timer(add_time)
    else:
        if time_left == 0:
        timer(add_time)
        else:
            add_this = time_left
            end_it = True
            while now != finish:
                time.sleep(0.1)
            timer(add_time + add_this)

显然这不起作用,因为每次拨打countdown_controller(15) fx时,它都会开始倒计时15秒,如果我点击我的按钮,则在计时器结束前没有任何事情发生。

非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

我会说代码的设计存在缺陷,因为你的屏幕输出会阻止整个程序无效(time.sleep(0.1))。

通常,在这些情况下您想要做的是在程序中有一个主循环,循环执行使程序运行的各种操作。这保证了在各种任务之间合理分配系统资源。

在您的特定情况下,您希望在主循环中拥有的内容是:

  • 检查用户输入(是否已添加额外时间?)
  • 更新倒计时的输出

示例实施:

import time
import curses

# The timer class    
class Timer():
    def __init__(self):
        self.target = time.time() + 5
    def add_five(self):
        self.target += 5
    def get_left(self):
        return int(self.target-time.time())

# The main program
t = Timer()
stdscr = curses.initscr()
stdscr.nodelay(True)
curses.noecho()
# This is the main loop done in curses, but you can implement it with
# a GUI toolkit or any other method you wish.
while True:
    left = t.get_left()
    if left <= 0:
        break
    stdscr.addstr(0, 0, 'Seconds left: %s ' % str(left).zfill(3))
    c = stdscr.getch()
    if c == ord('x') :
        t.add_five()
# Final operations start here
stdscr.keypad(0)
curses.echo()
curses.endwin()
print '\nTime is up!\n'

如果按x键(小写),上述程序会将计数器增加5秒。大多数代码是使用curses模块的样板,但当然如果你使用PyGTK,PySide或任何其他图形工具包,它将是不同的。

编辑:根据经验,在python中你想尽可能多地避免线程,因为它经常(但不总是)减慢程序的速度(参见“{{3} })因为它使软件更难调试/维护。

HTH!

答案 1 :(得分:0)

我可能会有一个Timer对象,其finish属性我可以简单地添加一个int。让timer在另一个线程中运行,然后您可以从GUI查询剩余的当前时间。

class Timer(object):
    def __init__(self, length):
        self.finish = time.time() + length

    def get_time(self):
        return time.time() >= self.finish