我想完成一个python脚本(func),它具有以下功能:
1.有两个线程,一个线程打印一条更新线,显示输入到终端前的剩余时间
2.另一个线程等待我对终端的输入(sys.stdin
)
3.我的问题是,虽然我使用我的func,如:
print '''input your file path,the default value will be "/root/targets.txt":>'''
get_input_intime([''],'/root/targets.txt',20)
但是我无法输入一个长文件abs路径,因为第一个线程总是打印剩下的时间,而我想实现:
a)终端中有两行
b)第一行作为第一个主题的打印字符串
c)第二行将接受我的输入,因此我可以输入我需要的文件路径,并且不会被第一个线程刷新,如下所示:
在终端:
4.我的代码是:
1)在几秒钟内获得chioce,如果没有输入,则返回默认的chioce
2)第一个参数是一个包含unfault chioces的列表。
例如,有4个chioce 1,2,3,4,如果我想将默认的chioce设为2,那么undefault_chioce_list就是[' 1',' 3' ,' 4'],每个列表都是str类型。3)第二个参数是默认的chioce值
4)第三个参数是输入前的时间(选择)
5)返回值是来自raw_input()
class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.name=name
self.func=func
self.args=args
def run(self):
self.result=apply(self.func,self.args)
def get_result():
return self.result
def get_input_intime(undefault_chioce_list,default_choose,timeout=5):
default_choose=[default_choose]
timeout=[timeout]
choosed=[0]
chioce=['']
def print_time_func():
while (choosed[0]==0 and timeout[0]>0):
sys.stdout.write("%s seconds left...please input your chioce:>\r" % timeout)
sys.stdout.flush()
time.sleep(1)
timeout[0]-=1
if choosed[0]==0:
chioce[0]=default_choose[0]
def input_func():
rlist, _, _ = select([sys.stdin], [], [], timeout[0])
if rlist:
chioce_and_enter = sys.stdin.readline()
choosed[0]=1
if chioce_and_enter[0] not in undefault_chioce_list:
chioce[0]=default_choose[0]
else:
chioce[0]=chioce_and_enter[0]
print "you choosed %s" % chioce[0]
else:
print "\nyou didn't input..."
print "I will choose the default chioce for you:%s" % default_choose[0]
time_left_thread=MyThread(print_time_func,())
input_thread=MyThread(input_func,())
time_left_thread.start()
input_thread.start()
time_left_thread.join()
input_thread.join()
return chioce[0]
答案 0 :(得分:0)
最后,我在下面的代码中实现了它,但是不能在一行中打印剩余时间,它会在行中打印剩余时间: ----------------------输出:---------------------
还剩20秒......请输入你的chioce:>
还剩19秒......请输入你的chioce:>
还剩18秒......请输入你的chioce:>
还剩17秒......请输入你的chioce:>
还剩16秒......请输入你的chioce:>
还剩15秒......请输入你的chioce:>
剩下14秒......请输入你的chioce:>>这是我的选择线
你选择了-------------------------端---------------------
import threading
import time
import sys
import readline
class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.name=name
self.func=func
self.args=args
def run(self):
self.result=apply(self.func,self.args)
def get_result():
return self.result
def get_input_intime(undefault_chioce_list,default_choose,timeout=5):
default_choose=[default_choose]
timeout=[timeout]
choosed=[0]
chioce=['']
def print_time_func():
while choosed[0]==0 and timeout[0]>0:
time.sleep(1)
sys.stdout.write('\r'+' '*(len(readline.get_line_buffer())+2)+'\r')
print "%s seconds left...please input your chioce:>" % timeout[0]
sys.stdout.write('> ' + readline.get_line_buffer())
sys.stdout.flush()
timeout[0]-=1
if choosed[0]==0:
chioce[0]=default_choose[0]
def input_func():
while choosed[0]==0 and timeout[0]>0:
s = raw_input('> ')
#rlist, _, _ = select([sys.stdin], [], [], timeout[0])
if s or len(s)==0:
input_value=s
choosed[0]=1
if input_value not in undefault_chioce_list:
chioce[0]=default_choose[0]
else:
chioce[0]=input_value
print "you choosed %s" % chioce[0]
time_left_thread=MyThread(print_time_func,())
input_thread=MyThread(input_func,())
time_left_thread.start()
input_thread.setDaemon(True)
input_thread.start()
time_left_thread.join()
if choosed[0]==0:
print "i choose the default chioce for you:%s" % chioce[0]
return chioce[0]
get_input_intime(['a','b','c'],'d',20)