我正在处理脚本运行时出现的python cli接口的一些基本动画。这与我写的每个脚本都有问题。如果我正在执行以下动画;
def animatedSpinner(*arg):
animation = ["|","/","-","\\"]
a = 0
while True:
print(animation[a % len(animation)], end="\r")
a += 1
time.sleep(0.1)
它运行正常,但是当用户正在运行时,任何按键都会按下屏幕上显示的按键。如何防止按键在动画期间或任何正常运行时出现在屏幕上?
答案 0 :(得分:3)
在POSIX和Windows上执行此操作的方法是如此不同,除非您想要搜索一个非常高级的包装器库(它确实存在 - 其中一些是最低通用分母但可能具有足够的功能这个,虽然其他人非常复杂),你不妨考虑他们分开的问题。既然你说POSIX是你真正关心的,我会解释一下。
执行此操作的正确方法是使用termios
。但这对于初学者来说可能有点毛茸茸,所以最后我会再回过头来看看。
如果您想要一个快速而又肮脏的解决方案,您只需致电stty
工具:
echoon
无论您采用哪种方式,请确保在退出之前始终致电reset
,无论如何。否则,您将使控制台处于非回显模式,您的用户(或您)将不得不盲目地执行stty echo
或try:
echooff()
# do stuff
finally:
echoon()
。
例如,在您的主要代码中:
@contextlib.contextmanager
def echo_disabled():
try:
echooff()
yield
finally:
echoon()
或者,更好的是,使用contextlib
:
with echo_disabled():
# do stuff
然后:
termios
tty
模块的source code是入门的好示例代码 - 但在这种情况下,您所做的与@contextlib.contextmanager
def echo_disabled():
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] = new[3] & ~termios.ECHO # lflags
try:
yield
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old)
文档中的示例非常接近:
{{1}}