2013-02-26 44 views
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() 
+0

什么问题? – PALEN 2013-02-26 02:49:00

+0

现在在问题中对问题进行了更全面的描述。 – jml 2013-02-26 03:08:57

回答

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.命中克,定时器开始3命中S, 计时器停止4.命中克,计时器启动等等。CTRL-C不应该​​是 来停止计时器,而是杀死程序。

然后编程范例必须改变。您正在考虑响应诸如按键等事件的Event-driven program。也许你需要创建一个线程,它检索哪个键被按下,如果sg被按下,而另一个线程打印时间,则相应的行为。

+0

好的,假设我不想调用sys.exit(),但只需停止计时器即可。我试图一次又一次地无法打断。这是我试图解决的问题的核心。 – jml 2013-02-26 04:03:46

+0

@jml从上面的代码中删除'sys.exit()'行只会停止计时器,您可以添加更多代码以便从那里执行 – PALEN 2013-02-26 04:06:34

+0

@jml然后将其他代码更改为'elif结果是's' :'它只会在从命令行得到's'后执行'sys.exit()'(在ctrl-c之后) – askewchan 2013-02-26 04:06:47

-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')

+0

我试过了,现在代码无法运行。我会更新我的问题。 – jml 2013-02-26 02:56:35