我正在为脚本运行时出现的 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)
它运行良好,但用户在运行时按下的任何键都会显示在屏幕上。如何防止在动画期间或功能运行时屏幕上出现按键?
在 POSIX 和 Windows 上执行此操作的方法非常不同,除非您想搜索非常高级的包装库(确实存在\xe2\x80\x94,其中一些是最低公分母,但可能具有足够的功能)对于这一点,而其他的则非常复杂),您不妨将它们视为单独的问题。既然你说 POSIX 是你真正关心的,我会解释一下。
\n\n执行此操作的正确方法是使用termios. 但这对于初学者来说可能有点棘手,所以我会在最后再讨论这个问题。
如果你想要一个快速而肮脏的解决方案,你可以调用该stty工具:
import subprocess\n\ndef echooff():\n subprocess.run([\'stty\', \'-echo\'], check=True)\ndef echoon():\n subprocess.run([\'stty\', \'echo\'], check=True)\nRun Code Online (Sandbox Code Playgroud)\n\n无论采用哪种方式,echoon无论如何,请确保在退出之前始终拨打电话。否则,您将使控制台处于非回显模式,并且您的用户(或您)将不得不盲目地执行reset或stty echo。
例如,在您的主代码中:
\n\ntry:\n echooff()\n # do stuff\nfinally:\n echoon()\nRun Code Online (Sandbox Code Playgroud)\n\n或者,更好的是,使用contextlib:
@contextlib.contextmanager\ndef echo_disabled():\n try:\n echooff()\n yield\n finally:\n echoon()\nRun Code Online (Sandbox Code Playgroud)\n\n然后:
\n\nwith echo_disabled():\n # do stuff \nRun Code Online (Sandbox Code Playgroud)\n\n该tty模块的源代码是很好的入门示例代码\xe2\x80\x94,但在这种情况下,您所做的与文档中的示例非常接近termios:
@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)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |