防止按键出现在屏幕上

Kim*_*aru 5 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)
Run Code Online (Sandbox Code Playgroud)

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

aba*_*ert 4

在 POSIX 和 Windows 上执行此操作的方法非常不同,除非您想搜索非常高级的包装库(确实存在\xe2\x80\x94,其中一些是最低公分母,但可能具有足够的功能)对于这一点,而其他的则非常复杂),您不妨将它们视为单独的问题。既然你说 POSIX 是你真正关心的,我会解释一下。

\n\n
\n\n

执行此操作的正确方法是使用termios. 但这对于初学者来说可能有点棘手,所以我会在最后再讨论这个问题。

\n\n

如果你想要一个快速而肮脏的解决方案,你可以调用该stty工具:

\n\n
import subprocess\n\ndef echooff():\n    subprocess.run([\'stty\', \'-echo\'], check=True)\ndef echoon():\n    subprocess.run([\'stty\', \'echo\'], check=True)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

无论采用哪种方式,echoon无论如何,请确保在退出之前始终拨打电话。否则,您将使控制台处于非回显模式,并且您的用户(或您)将不得不盲目地执行resetstty echo

\n\n

例如,在您的主代码中:

\n\n
try:\n    echooff()\n    # do stuff\nfinally:\n    echoon()\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,更好的是,使用contextlib

\n\n
@contextlib.contextmanager\ndef echo_disabled():\n    try:\n        echooff()\n        yield\n    finally:\n        echoon()\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后:

\n\n
with echo_disabled():\n    # do stuff    \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

tty模块的源代码是很好的入门示例代码\xe2\x80\x94,但在这种情况下,您所做的与文档中的示例非常接近termios

\n\n
@contextlib.contextmanager\ndef echo_disabled():\n    fd = sys.stdin.fileno()\n    old = termios.tcgetattr(fd)\n    new = termios.tcgetattr(fd)\n    new[3] = new[3] & ~termios.ECHO          # lflags\n    try:\n        yield\n    finally:\n        termios.tcsetattr(fd, termios.TCSADRAIN, old)\n
Run Code Online (Sandbox Code Playgroud)\n