【问题标题】:conditional keypress via command line通过命令行的条件按键
【发布时间】:2013-02-26 02:36:02
【问题描述】:

我有一个正在构建的测试用例,我想通过按键启动或停止计时器,但我不知道如何让我的例程保持活力......'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()

【问题讨论】:

  • 问题现在在问题中描述得更彻底。

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


【解决方案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 而另一个线程打印时间时采取相应的行动。

【讨论】:

  • 好吧,假设我不想调用 sys.exit(),而只是简单地停止计时器。我尝试这样做,但又无法打断。这是我试图解决的问题的核心。
  • @jml 从上面的代码中删除sys.exit() 行只会停止计时器,您可以从那里添加更多要执行的代码
  • @jml 然后将else: 更改为elif result is 's':,它只会在从命令行获取s 后执行sys.exit()(当然是在ctrl-c 之后)
  • @PALEN:这就是我想要的: 1. 启动程序 2. 按 g,计时器启动 3. 按 s,计时器停止 4. 按 g,计时器启动,等等。CTRL-C 不应该停止计时器的方式,而是杀死程序。我现在更新了我的问题,以更清楚地说明这个问题。
  • 无法通过命令行工作,因为在用户输入内容之前,屏幕不会更新(即不会打印任何内容)。换句话说,程序会一直等待用户输入并且不会(不断地)打印时间
【解决方案2】:

尝试将 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') 吗?

【讨论】:

  • 我试过了,现在代码没有运行。我会更新我的问题。
猜你喜欢
  • 2016-02-02
  • 2017-02-15
  • 2017-09-25
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2014-02-06
  • 1970-01-01
相关资源
最近更新 更多