有条件的按键通过命令行

时间:2013-02-26 02:36:02

标签: python macos command-line python-2.7 osx-lion

我有一个测试用例我正在构建,我想用按键开始或停止计时器,但我无法弄清楚如何保持我的日常生活...'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()

2 个答案:

答案 0 :(得分: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不应该​​这样   停止计时器,而是杀死程序。

然后编程范式必须改变。您正在考虑Event-driven program响应按键等事件。也许您需要创建一个线程,它会检索按下哪个键并在按下sg时按相应动作,而另一个线程打印时间。

答案 1 :(得分:-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')