gpt4 book ai didi

python - 如何在 tty.setcbreak() 之后重新打开控制台回显

转载 作者:行者123 更新时间:2023-11-28 22:03:36 25 4
gpt4 key购买 nike

我正在使用此命令禁用回显并使用 sys.stdin.read(1) 获取用户输入

tty.setcbreak(sys.stdin.fileno())

但是在我的程序运行过程中,我需要再次启用和禁用控制台回显。我试过了

fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
termios.tcsetattr(fd, termios.TCSADRAIN, old)

但这行不通。如何优雅地启用 echo?

ps:我使用的代码来自 Python nonblocking console input通过 mizipzor

代码如下:

import sys
import select
import tty
import termios
import time

def is_number(s):
try:
float(s)
return True
except ValueError:
return False

def calc_time(traw):
tfactor = {
's': 1,
'm': 60,
'h': 3600,
}
if is_number(g[:-1]):
return float(g[:-1]) * tfactor.get(g[-1])
else:
return None
def isData():
return select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], [])

old_settings = termios.tcgetattr(sys.stdin)
try:
tty.setcbreak(sys.stdin.fileno())
i = 0
while 1:
print i
i += 1
time.sleep(.1)
if isData():
c = sys.stdin.read(1)
if c:
if c == 'p':
print """Paused. Use the Following commands now:
Hit 'n' to skip and continue with next link.
Hit '5s' or '3m' or '2h' to wait for 5 secs, 3 mins or 3 hours
Hit Enter to continue from here itself.
Hit Escape to quit this program"""
#expect these lines to enable echo back again
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
old[3] = old[3] & termios.ECHO
termios.tcsetattr(fd, termios.TCSADRAIN, old)

g = raw_input("(ENABLE ECHO HERE):")

if g == '\x1b':
print "Escaping..."
break
if g == 'n':
#log error
continue
elif g[-1] in ['s','m','h']:
tval = calc_time(g)
if tval is not None:
print "Waiting for %s seconds."%(tval)
time.sleep(tval)
continue

finally:
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)

最佳答案

如果你看一下文档,那里有一个例子:

http://docs.python.org/library/termios.html#module-termios

您缺少 echo 标志的设置:

old[3] = old[3] | termios.ECHO

所以,整个事情是:

fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
old[3] = old[3] | termios.ECHO
termios.tcsetattr(fd, termios.TCSADRAIN, old)

关于python - 如何在 tty.setcbreak() 之后重新打开控制台回显,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8757915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com