如何用Python实现终端实时限制仅输入数字,屏蔽非数字字符
实现仅允许输入数字且非法字符不显示的方法
普通的input()函数无法满足你的需求,因为它会将所有输入的字符都回显到终端。要实现只允许输入数字、非法字符不显示的效果,需要直接捕获终端的单个输入字符,过滤掉非数字内容,仅回显合法的数字字符。下面提供几种可行的实现方式:
方法一:使用标准库curses(跨平台,Windows需额外安装)
curses是用于终端界面编程的标准库,Unix/Linux系统默认自带,Windows系统需要先安装windows-curses包(执行pip install windows-curses)。
import curses def get_numeric_input(prompt): # 初始化curses终端 stdscr = curses.initscr() stdscr.addstr(prompt) curses.echo() input_str = "" while True: char = stdscr.getch() # 按下回车时结束输入 if char == ord('\n'): break # 处理退格键,删除最后一个输入的数字 elif char == curses.KEY_BACKSPACE or char == 127: if input_str: input_str = input_str[:-1] # 光标回退一格,用空格覆盖原字符,再回退一格 stdscr.addstr("\b \b") # 判断是否为数字字符(ASCII码48-57对应0-9) elif 48 <= char <= 57: input_str += chr(char) stdscr.addch(char) # 恢复终端原有设置 curses.endwin() return input_str # 使用示例 read = get_numeric_input("Enter some numbers: ") print(f"\nYou entered: {read}")
方法二:Windows平台原生实现(无需额外库)
利用Windows自带的msvcrt库直接读取键盘输入:
import msvcrt def get_numeric_input(prompt): print(prompt, end="", flush=True) input_str = "" while True: char = msvcrt.getch() # 按下回车结束输入 if char == b'\r': print() break # 处理退格键 elif char == b'\x08': if input_str: input_str = input_str[:-1] # 回退并覆盖原字符 print("\b \b", end="", flush=True) # 判断是否为数字字符 elif char.isdigit(): input_str += char.decode('utf-8') print(char.decode('utf-8'), end="", flush=True) # 使用示例 read = get_numeric_input("Enter some numbers: ") print(f"You entered: {read}")
方法三:Unix/Linux平台原生实现(无需额外库)
通过termios和tty库修改终端模式,逐个读取输入字符:
import sys import termios import tty def get_numeric_input(prompt): print(prompt, end="", flush=True) fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: # 设置终端为原始模式,逐个读取字符 tty.setraw(sys.stdin.fileno()) input_str = "" while True: char = sys.stdin.read(1) # 按下回车结束输入 if char == '\n': print() break # 处理退格/删除键 elif char == '\x7f' or char == '\x08': if input_str: input_str = input_str[:-1] print("\b \b", end="", flush=True) # 判断是否为数字字符 elif char.isdigit(): input_str += char print(char, end="", flush=True) finally: # 恢复终端原有设置 termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return input_str # 使用示例 read = get_numeric_input("Enter some numbers: ") print(f"You entered: {read}")
以上三种方法都能实现你要的效果:输入数字时正常显示,输入字母等非法字符时不会在终端上显示,按下回车完成输入。
内容的提问来源于stack exchange,提问作者user69420
相关产品推荐
相关产品推荐

