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

Python 3.11(Windows11):实现同时打印输入并修复curses编辑问题

解决curses界面的复制粘贴与退格乱码问题及替代方案

修复现有curses代码的问题

1. 搞定退格乱码

curses默认对退格键的识别不统一,部分终端传BS(ASCII 8),部分传DEL(ASCII 127),直接判断多种键值并手动处理字符清除,就能解决乱码问题:

import curses
import time
import threading

def print_numbers(stdscr):
    num = 0
    while True:
        stdscr.addstr(0, 0, f"当前数字: {num}")
        stdscr.refresh()
        num += 1
        time.sleep(1)

def handle_input(stdscr):
    input_str = ""
    curses.cbreak()
    stdscr.keypad(True)
    while True:
        key = stdscr.getch()
        # 兼容多种退格键类型
        if key in (curses.KEY_BACKSPACE, 127, 8):
            if input_str:
                input_str = input_str[:-1]
                # 清除输入行最后一个字符,避免乱码残留
                stdscr.move(2, len(input_str))
                stdscr.clrtoeol()
        elif key in (10, 13, curses.KEY_ENTER):  # 处理回车提交
            stdscr.addstr(3, 0, f"你输入了: {input_str}")
            stdscr.clrtoeol()
            input_str = ""
        elif 32 <= key <= 126:  # 只处理可打印字符
            input_str += chr(key)
            stdscr.addstr(2, 0, f"输入: {input_str}")
        stdscr.refresh()

def main(stdscr):
    stdscr.clear()
    # 启动数字打印线程,不阻塞输入逻辑
    thread = threading.Thread(target=print_numbers, args=(stdscr,))
    thread.daemon = True
    thread.start()
    handle_input(stdscr)

if __name__ == "__main__":
    curses.wrapper(main)

2. 解决复制粘贴问题

curses本身不支持系统剪贴板,可通过以下两种方式解决:

  • 借助pyperclip库读取剪贴板:先安装库pip install pyperclip,然后在输入处理函数中添加Ctrl+V的判断逻辑:
import pyperclip

def handle_input(stdscr):
    input_str = ""
    curses.cbreak()
    stdscr.keypad(True)
    while True:
        key = stdscr.getch()
        # 处理Ctrl+V粘贴(ASCII 22对应Ctrl+V的键值)
        if key == 22:
            paste_content = pyperclip.paste()
            input_str += paste_content
            stdscr.addstr(2, 0, f"输入: {input_str}")
        # 其余键处理逻辑和上方代码一致...
  • Linux/macOS环境下,可尝试开启curses.raw()模式,让终端自行处理复制粘贴,但可能影响部分特殊键识别,需自行测试调整。

替代方案:用prompt_toolkit实现更省心的界面

如果不想折腾curses的底层细节,直接用prompt_toolkit——这个库原生支持剪贴板、行编辑,UI布局灵活,完全满足需求:

先安装库:pip install prompt_toolkit

示例代码:

from prompt_toolkit import Application
from prompt_toolkit.layout import Layout, HSplit, Window
from prompt_toolkit.widgets import TextArea
import threading
import time

def print_numbers(output_area):
    num = 0
    while True:
        output_area.text = f"当前数字: {num}\n"
        num += 1
        time.sleep(1)

def main():
    # 顶部只读区域,显示数字
    output_area = TextArea(read_only=True, scrollbar=False)
    # 底部输入区域
    input_area = TextArea(prompt="输入: ", multiline=False)
    
    # 布局:上下分栏
    layout = Layout(HSplit([
        Window(content=output_area, height=1),
        Window(content=input_area)
    ]))
    
    # 启动数字打印线程
    thread = threading.Thread(target=print_numbers, args=(output_area,))
    thread.daemon = True
    thread.start()
    
    # 输入提交逻辑
    def on_input_submit(buffer):
        input_text = buffer.text
        buffer.text = ""
        output_area.text += f"你输入了: {input_text}\n"
    
    input_area.buffer.validate_and_handle = on_input_submit
    
    # 启动应用
    app = Application(layout=layout)
    app.run()

if __name__ == "__main__":
    main()

该方案优势:

  • 直接用系统默认的Ctrl+C/Ctrl/V实现复制粘贴,无需额外处理
  • 退格、方向键等编辑键正常工作,无乱码问题
  • 界面布局可灵活调整,支持滚动条、多区域划分等功能

内容的提问来源于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.17 19:38:11