通过命令行实现条件按键

1 投票
2 回答
698 浏览
提问于 2025-04-17 17:07

我正在创建一个测试案例,想要通过按键来启动或停止一个计时器,但我不知道怎么让我的程序一直运行下去……按下'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 个回答

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

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 不应该是停止计时器的方式,而是用来结束程序。

那么,你的编程思路需要改变。你需要考虑一种 事件驱动的程序,它会对像按键这样的事件做出反应。也许你需要创建一个 线程,用来检测按下了哪个键,并在按下 sg 时做出相应的反应,而另一个线程则负责打印时间。

撰写回答