加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有