2010-05-20 92 views
2

我正在Python中编写一个简单的双计时器。 (我正在运行Linux,这应该只需要在我的系统上运行。)这个想法是脚本有两个单独的定时器,其中一个定时器在任何时候都运行。用户应该能够按下按钮来切换正在运行的定时器,或者同时暂停。目前,测试脚本是这样的:在stdin中捕获单字符输入,同时输出到Python中的stdout

now = datetime.datetime.now() 
until = now + datetime.timedelta(minutes=2) 
print now, 
while now < until: 
    print "\r", 
    now = datetime.datetime.now() 
    print now, 
    sys.stdout.flush() 
    # check stdin here 
    time.sleep(0.1) 

(我在这里省略的代码进口。)

此输出定时器每0.1秒标准输出的电流值,覆盖以前的这样做的价值。

但是,我遇到了问题,正在制定如何实施# check stdin here系列。理想情况下,用户应该能够按下,比如“p”,并且计时器将被暂停。目前,我有这个代替time.sleep(0.1)

if select.select([sys.stdin],[],[],0.1)[0]: 
    print sys.stdin.readline().strip() 

...它的工作原理,但它要求用户按一个命令输入得到认可。有没有办法做到这一点,而不需要输入被按下?

回答

2

看到这个SO questionthis article

这两个描述平台特定的选项或使用类似pygame的东西。但是,如果你需要一个不需要任何外部依赖的跨平台解决方案(例如pygame),我认为你也应该能够通过标准库中的线程模块来完成它。 (给我一点,我会尝试使用线程模块拼凑一些东西......)

+1

本文中描述的“Linux非阻塞控制台输入”解决方案完全符合我的需求,谢谢!这里我不需要任何跨平台兼容性。 其他人建议使用curses,这也适用,因为默认情况下,curses会使用termios方法设置相同的模式。 termios方法不会更改任何其他设置,但是,诅咒会这样做,所以它更加整洁。 – Sam 2010-05-20 17:39:46

+0

很高兴帮助!忽略我关于线程模块的一点。在那里,我离开了基地。 – 2010-05-20 19:02:41

相关问题