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

如何在Python程序中修改终端光标类型 适配文本游戏开发

Python 文本游戏终端光标修改实现方案

你当前采用的修改Windows Terminal配置、新增专属配置文件再拉起终端启动游戏的方案存在明显缺陷:

  • 每次运行都会向WT配置列表追加新条目,重复运行会直接污染用户的终端配置
  • 强绑定Windows Terminal,用户使用默认cmd、PowerShell或其他终端时完全失效
  • 需要额外拉起新进程,无法在当前已运行的终端窗口内直接生效

以下是可落地的实现方案,按推荐优先级排序:

方案1:ANSI转义序列实现(优先选用)

这是全平台现代终端通用的标准实现方式,不需要修改任何系统/软件配置,不需要拉起新进程,直接在Python代码内输出对应转义序列即可即时修改光标样式,兼容Windows Terminal、新版cmd、PowerShell、macOS/Linux默认终端等绝大多数环境。

常见光标样式对应的转义序列如下:

  • \x1b[1 q:闪烁实心方块
  • \x1b[2 q:稳态实心方块(对应Windows Terminal的vintage复古光标)
  • \x1b[3 q:闪烁下划线
  • \x1b[4 q:稳态下划线
  • \x1b[5 q:闪烁竖线(多数终端默认样式)
  • \x1b[6 q:稳态竖线

基础实现代码:

import sys
import ctypes

# Windows 低版本系统提前开启ANSI转义支持
def enable_ansi_support():
    try:
        kernel32 = ctypes.windll.kernel32
        kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)
    except:
        # 非Windows系统或不支持的环境直接跳过
        pass

# 切换为复古方块光标
def set_cursor_vintage():
    sys.stdout.write("\x1b[2 q")
    sys.stdout.flush()

# 恢复默认竖线光标
def reset_cursor():
    sys.stdout.write("\x1b[5 q")
    sys.stdout.flush()

if __name__ == "__main__":
    enable_ansi_support()
    set_cursor_vintage()
    try:
        # 此处放置游戏主逻辑
        input("光标已切换为复古方块样式,按回车退出")
    finally:
        # 无论游戏正常退出还是报错崩溃,都恢复默认光标样式
        reset_cursor()

注意:必须在游戏退出前恢复默认光标样式,否则程序退出后终端会保持修改后的光标状态,影响用户后续使用。

方案2:Windows Terminal 固定配置启动(仅特殊场景使用)

如果确实需要通过WT专属配置启动游戏,必须修复原代码重复追加配置的问题,提前判断配置是否已存在,避免重复写入污染用户配置。优化后代码参考:

from os import system, getenv
from json import loads, dumps
import uuid
import os

apd = getenv("LOCALAPPDATA")
wt_settings_path = rf"{apd}\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"

if os.path.exists(wt_settings_path):
    with open(wt_settings_path, 'r', encoding='utf-8') as f:
        pf = loads(f.read())
    # 检查是否已存在Game配置,不存在才新增
    profile_exists = any(p.get('name') == 'Game' for p in pf['profiles']['list'])
    if not profile_exists:
        pf['profiles']['list'].append({
            "guid": str(uuid.uuid4()),
            "name": "Game",
            "commandline": "C:\\Windows\\System32\\cmd.exe",
            "cursorShape": "vintage",
            "font": {"face": "Consolas"}
        })
        with open(wt_settings_path, 'w', encoding='utf-8') as f:
            f.write(dumps(pf, indent=2))
    # 替换为实际游戏文件路径后即可启动
    # system(rf'wt -F -d "{os.getcwd()}" -p "Game" --title Game python game.py')

方案选择建议

  • 普通文本游戏开发优先选择ANSI转义序列方案,无侵入、兼容性好、实现简单,是终端类应用修改样式的通用标准
  • 不推荐修改终端全局配置的方案,侵入性强,适配范围窄,容易引发用户终端配置异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:18:56