防止按键出现在屏幕上

时间:2018-03-30 17:34:36

标签: python python-3.x

我正在处理脚本运行时出现的python cli接口的一些基本动画。这与我写的每个脚本都有问题。如果我正在执行以下动画;

def animatedSpinner(*arg):
    animation = ["|","/","-","\\"]
    a = 0
    while True:
        print(animation[a % len(animation)], end="\r")
        a += 1
        time.sleep(0.1)

它运行正常,但是当用户正在运行时,任何按键都会按下屏幕上显示的按键。如何防止按键在动画期间或任何正常运行时出现在屏幕上?

1 个答案:

答案 0 :(得分:3)

在POSIX和Windows上执行此操作的方法是如此不同,除非您想要搜索一个非常高级的包装器库(它确实存在 - 其中一些是最低通用分母但可能具有足够的功能这个,虽然其他人非常复杂),你不妨考虑他们分开的问题。既然你说POSIX是你真正关心的,我会解释一下。

执行此操作的正确方法是使用termios。但这对于初学者来说可能有点毛茸茸,所以最后我会再回过头来看看。

如果您想要一个快速而又肮脏的解决方案,您只需致电stty工具:

echoon

无论您采用哪种方式,请确保在退出之前始终致电reset,无论如何。否则,您将使控制台处于非回显模式,您的用户(或您)将不得不盲目地执行stty echotry: 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}}