You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python的input()函数中实现模板式填空输入?

实现带固定模板的交互式输入功能

你需要的是一个能让用户在预设模板的指定位置填空的输入工具,区别于普通input()的提示语,模板里的固定字符不可修改,输入时光标自动跳过固定内容,最终仅返回用户输入的部分。以下是基于Python的实现方案:

核心思路

  1. 解析输入模板,区分可输入占位符(比如你示例中的%)和固定字符
  2. 在终端中实时渲染模板,光标仅停留在可输入位置
  3. 处理键盘输入:输入字符填充占位符,回车后提取并返回用户输入的内容

代码实现(基于curses库)

curses库可以直接控制终端的光标位置和输入输出,适合实现这种交互式功能:

import curses

def template_input(stdscr, prompt, template, placeholder='%'):
    # 初始化界面
    stdscr.clear()
    stdscr.addstr(prompt)
    prompt_len = len(prompt)
    
    # 解析模板,记录可输入位置的索引
    template_chars = list(template)
    input_positions = [i for i, char in enumerate(template_chars) if char == placeholder]
    input_values = [''] * len(input_positions)
    current_input_idx = 0  # 当前正在编辑的占位符索引
    
    while True:
        # 渲染模板:替换占位符为已输入内容或下划线(光标位置)
        display_template = []
        input_ptr = 0
        for idx, char in enumerate(template_chars):
            if char == placeholder:
                if input_ptr == current_input_idx:
                    # 当前光标位置显示下划线(或已输入的字符)
                    display_char = input_values[input_ptr] if input_values[input_ptr] else '_'
                else:
                    display_char = input_values[input_ptr] if input_values[input_ptr] else ' '
                display_template.append(display_char)
                input_ptr += 1
            else:
                display_template.append(char)
        
        # 更新显示
        stdscr.addstr(prompt_len, 0, ''.join(display_template))
        # 移动光标到当前输入位置
        cursor_pos = prompt_len + input_positions[current_input_idx]
        stdscr.move(stdscr.getyx()[0], cursor_pos)
        stdscr.refresh()
        
        # 处理键盘输入
        key = stdscr.getch()
        
        if key == curses.KEY_ENTER or key in [10, 13]:
            # 回车确认,返回用户输入的内容(按顺序拼接)
            return ''.join(input_values)
        elif key == curses.KEY_LEFT:
            # 左移光标,跳过固定字符
            if current_input_idx > 0:
                current_input_idx -= 1
        elif key == curses.KEY_RIGHT:
            # 右移光标,跳过固定字符
            if current_input_idx < len(input_positions) - 1:
                current_input_idx += 1
        elif 32 <= key <= 126:
            # 可打印字符,填充当前占位符
            input_values[current_input_idx] = chr(key)
            # 自动跳转到下一个占位符(如果当前已填充)
            if current_input_idx < len(input_positions) - 1:
                current_input_idx += 1
        elif key == curses.KEY_BACKSPACE or key == 127:
            # 删除当前占位符的内容
            input_values[current_input_idx] = ''

# 使用示例
if __name__ == '__main__':
    result = curses.wrapper(template_input, "Date of birth: ", "%/%/%")
    print(f"\nYou entered: {result}")

功能说明

  • 运行后,终端会显示Date of birth: _/ / ,光标停留在第一个下划线位置
  • 输入数字后,光标会自动跳转到下一个占位符位置,斜杠/无法修改
  • 支持左右箭头切换输入位置,退格键删除当前位置内容
  • 回车后,仅返回用户输入的字符(比如输入20240520,返回20240520)

注意事项

  • Windows系统需要先安装windows-curses库:pip install windows-curses
  • 如果不需要光标自动跳转,可删除代码中自动切换下一个占位符的逻辑
  • 可自定义占位符(比如用_代替%),只需修改函数的placeholder参数

内容的提问来源于stack exchange,提问作者SSudor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:52:44