如何修复使用ANSI代码格式化print函数时的异常输出问题
问题修复:ANSI颜色转义序列在rich print中失效
问题现象
单独使用print(f"\033[32m{newDict[0][1]}\033[0m")可以正常为字典值添加颜色打印,但将该逻辑放入函数的for循环后,输出异常,转义字符被当作普通文本显示,错误输出示例:
| [39m_[0m [39m_[0m [39m_[0m [39m_[0m [39m_[0m | | [39m_[0m [39m_[0m [39m_[0m [39m_[0m [39m_[0m |
错误原因
你导入了from rich import print,rich库的print函数有自己的格式化系统,它不会解析原生的ANSI转义序列(\033[xxm),而是将其作为普通字符串输出,导致转义字符直接显示在终端中。
修复方案
有两种可行的修复方式:
方式1:改用原生Python print函数
移除from rich import print的导入,使用Python默认的print函数,原生print可以正常解析ANSI转义序列。
修改后的boardprint函数无需改动,只需调整导入语句:
# 移除 from rich import print,改用默认print import random testList = ["PRICE"] word = random.choice(testList) # ... 其余代码不变
方式2:使用rich库的原生语法设置颜色
如果需要保留rich的其他功能,可以用rich的标记语法来设置颜色,替换ANSI转义序列:
修改boardprint函数如下:
def boardprint(color): global board # 定义rich颜色映射:39是默认灰色,32是绿色,33是黄色 color_map = { 39: "dim white", 32: "green", 33: "yellow" } for x in range(6): # 用rich的标记语法生成每个格子的带色文本 cells = [ f"[{color_map.get(c, 'dim white')}]{board[x+1][i]}[/]" for i, c in enumerate(color) ] print(" |", *cells, "|")
同时,在checkRight函数中需要正确设置colorList的颜色值:
# 绿色对应32,黄色对应33,默认灰色39 if guess[x].upper() == word[x]: # green print("green") letter = guess[x] updateRow.append(str(letter)) colorList[x] = 32 # 改为32对应绿色 elif guess[x].upper() in word and result[guess[x]] == 0: # yellow print("Yellow") letter = guess[x] updateRow.append(letter) colorList[x] = 33 # 改为33对应黄色 else: # grey print("grey") letter = guess[x] updateRow.append(letter) colorList[x] = 39 # 默认灰色
完整修复后代码(方式2示例)
from rich import print import random testList = ["PRICE"] word = random.choice(testList) board = { 6 : ["_", "_", "_", "_", "_"], 5 : ["_", "_", "_", "_", "_"], 4 : ["_", "_", "_", "_", "_"], 3 : ["_", "_", "_", "_", "_"], 2 : ["_", "_", "_", "_", "_"], 1 : ["_", "_", "_", "_", "_"], } def boardprint(color): global board color_map = { 39: "dim white", 32: "green", 33: "yellow" } for x in range(6): cells = [ f"[{color_map.get(c, 'dim white')}]{board[x+1][i]}[/]" for i, c in enumerate(color) ] print(" |", *cells, "|") guess = "" def ask(): global guess print("hello! welcome to [bold green]WORDLE[/bold green]") print("\tTry to guess a 5-letter word in 6 guesses or less.\n\t\tIf a letter is [green]green[/green], then it is in the right place,\n\t\tIf a letter is [yellow]yellow[/yellow], then it is in the wrong place, \n\t\tif a letter is [black]grey[/black], then it is the wrong letter.") print() guess = input("FIRST GUESS > ").upper() guess = list(guess) return guess colorList = [39, 39, 39, 39, 39] def checkRight(guess, word, row): global board, colorList GuessCheckDouble = {i:guess.count(i) for i in guess} WordCheckDouble = {i:word.count(i) for i in word} result = {key: GuessCheckDouble[key] - WordCheckDouble.get(key, 0) for key in GuessCheckDouble.keys()} updateRow = [] for x in range(len(word)): if guess[x].upper() == word[x]: # green print("green") letter = guess[x] updateRow.append(str(letter)) colorList[x] = 32 elif guess[x].upper() in word and result[guess[x]] == 0: # yellow print("Yellow") letter = guess[x] updateRow.append(letter) colorList[x] = 33 else: # grey print("grey") letter = guess[x] updateRow.append(letter) colorList[x] = 39 board.update({row : [updateRow[0], updateRow[1], updateRow[2], updateRow[3], updateRow[4]]}) boardprint(colorList) return board, colorList word = word.upper() word = list(word) boardprint(colorList) ask() print(guess) checkRight(guess, word, 1) print(word) print(board) boardprint(colorList)
内容的提问来源于stack exchange,提问作者edwardvth
相关产品推荐
相关产品推荐

