Pythoninput实现等待键盘输入,超时返回缺省值,并且释放input
(2019-03-10 17:45:16)
标签:
python |
分类: Python编程 |
网上找了很久,没有看到完全符合标题目标的代码。所以自己总结了一下各种方法,合并成一个函数。
基本思路:
1. 首先用线程来运行input()命令
2.
用join(timeout=??)来控制这个线程的等待时间。这是个人觉得最方便的方法,其他的方法都是要创建另外一个线程来控制时间,实现超时控制。而join()的方法只需一个线程就可以了,明确方便。
3.
join()后,用is_alive()来判断线程是否还在,如果在,就说明没有输入,超时了,返回缺省值。如果is_alive()判断没有线程了,说明已经有输入了,则返回输入的值。
4.
这个时候,虽然可以有了正确的返回值。但是如果是超时的话,虽然可以往后面运行了,但是线程本身还在运行,也就是input()还是占用着界面等待输入。后面的程序就无法再次用input()来获取输入了。因此必须要终止目前这个input()。
尝试过daemon=true,但这个方法是程序运行完后,才会结束这个线程。也就是程序结束后,后继的程序才能用input(),但当前这个程序里面,还是没有办法用input()。
查看了不少方法,感觉最简单的就是模拟键盘输入,给一个回车键,这样input()就结束了,线程就结束了。可以放心开始后面的input()了。模拟键盘有好几个方法,都可以的。我这里用了PyKeyboard()。
具体代码如下:
def getInputFromStdin(sInformation, sDefaultValue=None,
iDelayTime=0):
def get_input(sInformation, dictData):
# 线程,获得键盘输入,存储到dictData
dictData["input"]=input(sInformation)
dictData={}
dictData["input"]=sDefaultValue # 缺省返回值
sReturn=sDefaultValue # 缺省返回值
input_thread = threading.Thread(target=get_input,
args=(sInformation, dictData)) # 创建线程
input_thread.daemon = True # 随程序结束,可以不需要
input_thread.start() # 开始线程
if iDelayTime==0: # 0 表示等待直到有输入
input_thread.join()
else: # 有延时要求,就等待一定的时间,然后继续下面的代码
input_thread.join(timeout=iDelayTime)
if input_thread.is_alive(): # 超时,则用缺省值,并模拟按下回车结束线程
keySim=pykeyboard.PyKeyboard()
keySim.tap_key(keySim.enter_key)
input_thread.join() # 等待线程结束
else: # 有输入,线程已经结束的,则输入作为返回值
sReturn=dictData["input"]
return sReturn
前一篇:2018总结之-外传:第二个胃
后一篇:模拟操作2019年终总结