msvcrt.getch()后print无实时输出的Python密码输入问题
解决密码输入时星号实时显示的问题
我懂你遇到的这个糟心事——输入密码的时候,星号非要等你输完所有字符才一下子蹦出来,完全没达到实时反馈的效果对吧?其实这都是Python的输出缓冲在搞鬼,咱们分分钟就能搞定它。
问题根源
Python的标准输出默认是行缓冲模式:只有当输出内容里包含换行符(\n),或者缓冲区被填满时,才会把内容真正显示到控制台。你用print('*', end='')的时候,没有触发换行,所以每一个星号都被暂时存进了缓冲区,直到最后你打印\n的瞬间,才一次性把所有星号和后续内容刷出来。
两种解决方案
方法1:给print加flush=True参数
直接修改你的print语句,加上flush=True,告诉Python每次打印完立刻把内容输出到控制台:
import msvcrt if __name__ == '__main__': string = '' ch = msvcrt.getch() while ch != b'\r': print('*', end='', flush=True) # 关键改动:添加flush=True string += ch.decode('utf-8') ch = msvcrt.getch() print('\nEntered string is: ', string)
方法2:手动调用sys.stdout.flush()
要是不想改print的参数,也可以在每次打印星号后手动刷新输出缓冲区,记得先导入sys模块:
import msvcrt import sys if __name__ == '__main__': string = '' ch = msvcrt.getch() while ch != b'\r': print('*', end='') sys.stdout.flush() # 手动刷新缓冲区 string += ch.decode('utf-8') ch = msvcrt.getch() print('\nEntered string is: ', string)
两种方法都能实现你想要的效果:每输入一个字符,对应的星号就会立刻显示在屏幕上,完美模拟日常的密码输入体验。
内容的提问来源于stack exchange,提问作者Sreekar Mouli
相关产品推荐
相关产品推荐

