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

Python 3.11中如何为input函数设置占位符?

在Python 3.11中为input函数实现带颜色的占位符

完全可以实现你需要的效果,下面提供几种不同的实现方式:

方法1:ANSI转义码+自定义输入逻辑

利用终端的ANSI转义码控制颜色和光标位置,手动处理输入过程中的占位符显示/隐藏逻辑,无需额外依赖。

import sys

def input_with_placeholder(prompt, placeholder, placeholder_color="\033[90m", prompt_color="\033[0m"):
    reset_color = "\033[0m"
    # 打印提示文本
    sys.stdout.write(prompt_color + prompt + reset_color)
    sys.stdout.flush()
    
    # 打印灰色占位符
    sys.stdout.write(placeholder_color + placeholder + reset_color)
    sys.stdout.flush()
    
    user_input = []
    # 光标移到占位符开头
    sys.stdout.write(f"\033[{len(placeholder)}D")
    sys.stdout.flush()
    
    while True:
        char = sys.stdin.read(1)
        if char == "\n":
            # 回车时清除未输入内容的占位符
            if not user_input:
                sys.stdout.write(f"\033[{len(placeholder)}C" + " " * len(placeholder) + f"\033[{len(placeholder)}D")
            sys.stdout.write("\n")
            sys.stdout.flush()
            return ''.join(user_input)
        elif char == "\x7f":  # 处理退格键
            if user_input:
                user_input.pop()
                sys.stdout.write("\b \b")
                sys.stdout.flush()
            # 输入为空时恢复占位符
            if not user_input:
                sys.stdout.write(placeholder_color + placeholder + reset_color)
                sys.stdout.write(f"\033[{len(placeholder)}D")
                sys.stdout.flush()
        else:
            # 第一个输入字符时清除占位符
            if not user_input:
                sys.stdout.write(" " * len(placeholder) + f"\033[{len(placeholder)}D")
                sys.stdout.flush()
            user_input.append(char)
            sys.stdout.write(char)
            sys.stdout.flush()

# 调用示例
name = input_with_placeholder("Enter Your Name: ", "John Doe")
print(f"You entered: {name}")
  • \033[90m 是灰色ANSI转义码,\033[0m 用于重置颜色
  • 通过光标移动指令控制占位符的覆盖与恢复,处理了回车、退格等基础输入事件

方法2:使用curses模块(系统级终端控制)

curses是Python标准库中的终端控制模块,能精准处理终端界面和输入事件,适合复杂交互场景。

import curses

def input_with_placeholder(stdscr, prompt, placeholder):
    # 初始化颜色对:1号为灰色占位符,2号为正常文本
    curses.init_pair(1, curses.COLOR_GRAY, curses.COLOR_BLACK)
    curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLACK)
    
    # 打印提示文本
    stdscr.addstr(prompt, curses.color_pair(2))
    prompt_len = len(prompt)
    placeholder_len = len(placeholder)
    
    # 打印灰色占位符
    stdscr.addstr(placeholder, curses.color_pair(1))
    # 光标移到占位符开头
    stdscr.move(curses.getsyx()[0], prompt_len)
    
    user_input = []
    while True:
        key = stdscr.getch()
        if key in (curses.KEY_ENTER, 10, 13):
            # 回车时清除未输入内容的占位符
            if not user_input:
                stdscr.move(curses.getsyx()[0], prompt_len)
                stdscr.addstr(" " * placeholder_len)
            stdscr.addstr("\n")
            return ''.join(user_input)
        elif key in (curses.KEY_BACKSPACE, 127):
            if user_input:
                user_input.pop()
                # 清除当前字符并移动光标
                stdscr.move(curses.getsyx()[0], curses.getsyx()[1]-1)
                stdscr.addstr(" ")
                stdscr.move(curses.getsyx()[0], curses.getsyx()[1]-1)
            # 输入为空时恢复占位符
            if not user_input:
                stdscr.move(curses.getsyx()[0], prompt_len)
                stdscr.addstr(placeholder, curses.color_pair(1))
                stdscr.move(curses.getsyx()[0], prompt_len)
        elif 32 <= key <= 126:  # 处理可打印字符
            if not user_input:
                # 清除占位符
                stdscr.move(curses.getsyx()[0], prompt_len)
                stdscr.addstr(" " * placeholder_len)
                stdscr.move(curses.getsyx()[0], prompt_len)
            user_input.append(chr(key))
            stdscr.addstr(chr(key), curses.color_pair(2))

# 启动curses应用
if __name__ == "__main__":
    name = curses.wrapper(input_with_placeholder, "Enter Your Name: ", "John Doe")
    print(f"You entered: {name}")
  • 利用curses的颜色对功能区分占位符和提示文本
  • 精准控制光标位置和屏幕刷新,支持更多特殊按键处理

方法3:使用第三方库prompt-toolkit

如果不想手动处理底层逻辑,可以用prompt-toolkit库,它内置了占位符、颜色配置等功能,API更友好。

先安装库:

pip install prompt-toolkit

实现代码:

from prompt_toolkit import prompt
from prompt_toolkit.styles import Style

# 定义样式:占位符设为灰色
style = Style.from_dict({
    'placeholder': '#888888',
})

# 调用prompt函数,设置占位符和样式
name = prompt(
    "Enter Your Name: ",
    placeholder="John Doe",
    style=style
)

print(f"You entered: {name}")
  • 库自动处理占位符的显示/隐藏逻辑,包括退格恢复占位符的场景
  • 样式配置简单,支持更复杂的终端格式设置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:03:22