1

我有一个正在构建的测试用例,我想通过按键启动或停止计时器,但我不知道如何让我的例程保持活力......'g'应该启动计时器(并不断重复),并且 's' 应该停止计时器。然后'g' 可以启动计时器,等等。相反,'g' 启动计时器而's' 什么都不做。我究竟做错了什么?

代码:

#!/usr/bin/env python

import time, sys 

def print_something(status):
    while(status):
        print 'the time: ' , time.ctime()
        time.sleep(1);

def main():
    result = 1 
    print 'starting time: ' , time.ctime()

    result = raw_input('press g to start timer, s to stop.\n')
    while(result is 'g'):
        print_something(True)
        result = ''

    result = None
    time.stop()

main()
4

2 回答 2

1

您的主要问题是您正在尝试读取stdin但控制流卡在print_something函数中(在这种情况下是无限循环)并且根本不会从那里离开。换句话说,您想在用户输入时读取“s”,但在循环完成之前,这部分代码不会被执行。

你需要打断一下。下面的代码完成了你想要的,但是,用户必须按“Ctrl+C”来停止计时器。

#!/usr/bin/env python

import time, sys 

def main():
    result = 1 
    print 'starting time: ' , time.ctime()

    while(result):
        result = raw_input('press g to start timer, ctrl+c to stop.\n')

        if result is 'g':
            print_something()
            result = ''
        else:
            result = None
            time.stop()
            sys.exit()

def print_something():
    while 1:
        try:
            print 'the time: ' , time.ctime()
            time.sleep(1);
        except KeyboardInterrupt:            
            break
main()

编辑:

这就是我想要的: 1. 启动程序 2. 按 g,计时器启动 3. 按 s,计时器停止 4. 按 g,计时器启动等。CTRL-C 不应该是停止计时器的方式,而是要杀死该程序。

然后编程范式必须改变。您正在考虑一个事件驱动程序,它响应诸如按键之类的事件。也许您需要创建一个线程来检索按下了哪个键并在另一个线程打印时间时相应地执行s或被按下。g

于 2013-02-26T04:00:57.920 回答
-1

尝试将while循环移动到main函数内部。

def main():
result = 1
print 'starting time: ' , time.ctime()
while(result):
result = raw_input('press g to start timer, s to stop.\n')

if result is 'g':
    print_something()
    result = ''
elif result is 's':
    result = None
    time.stop()
    sys.exit()

更新:你试过测试while(result != 's')吗?

于 2013-02-26T02:40:24.987 回答