[英]How to format print statement using ANSI Codes using function?
我知道我可以print(f"\033[32m{newDict[0][1]}\033[0m", f"\033[32m{newDict[1][1]}\033[0m")
到以彩色打印字典值,
但是我将它放入 function 和它的 output 内的 for 循环中很奇怪,而不是 output 我想要的。
输入:
board = {
6 : ["_", "_", "_", "_", "_"],
5 : ["_", "_", "_", "_", "_"],
4 : ["_", "_", "_", "_", "_"],
3 : ["_", "_", "_", "_", "_"],
2 : ["_", "_", "_", "_", "_"],
1 : ["_", "_", "_", "_", "_"]
}
def boardprint(color):
global board
for x in range(6):
print(" |", f"\033[{color[0]}m{board[x + 1][0]}\033[0m", f"\033[{color[1]}m{board[x + 1][1]}\033[0m", f"\033[{color[2]}m{board[x + 1][2]}\033[0m", f"\033[{color[3]}m{board[x + 1][3]}\033[0m", f"\033[{color[4]}m{board[x + 1][4]}\033[0m", "|")
OUTPUT:
| [39m_[0m [39m_[0m [39m_[0m [39m_[0m [39m_[0m |
| [39m_[0m [39m_[0m [39m_[0m [39m_[0m [39m_[0m |
| [39m_[0m [39m_[0m [39m_[0m [39m_[0m [39m_[0m |
| [39m_[0m [39m_[0m [39m_[0m [39m_[0m [39m_[0m |
| [39m_[0m [39m_[0m [39m_[0m [39m_[0m [39m_[0m |
| [39m_[0m [39m_[0m [39m_[0m [39m_[0m [39m_[0m |
我该如何解决这个问题,以便它只为每个值/图块打印_
?
完整代码:
from rich import print
import random
testList = ["PRICE"]
word = random.choice(testList)
board = {
6 : ["_", "_", "_", "_", "_"],
5 : ["_", "_", "_", "_", "_"],
4 : ["_", "_", "_", "_", "_"],
3 : ["_", "_", "_", "_", "_"],
2 : ["_", "_", "_", "_", "_"],
1 : ["_", "_", "_", "_", "_"]
}
def boardprint(color):
global board
for x in range(6):
print(" |", f"\033[{color[0]}m{board[x + 1][0]}\033[0m", f"\033[{color[1]}m{board[x + 1][1]}\033[0m", f"\033[{color[2]}m{board[x + 1][2]}\033[0m", f"\033[{color[3]}m{board[x + 1][3]}\033[0m", f"\033[{color[4]}m{board[x + 1][4]}\033[0m", "|")
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] = 39
elif guess[x].upper() in word and result[guess[x]] == 0: # yellow
print("Yellow")
letter = guess[x]
updateRow.append(letter)
else: # grey
print("grey")
letter = guess[x]
updateRow.append(letter)
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)
对于您的特定目的,您不需要rich
,它的print
function 实际上会导致您的问题,因为它本身似乎破坏了 ANSI 序列。
您只能使用 Python 内置插件执行此操作:
board = {
6 : ["_", "_", "_", "_", "_"],
5 : ["_", "_", "_", "_", "_"],
4 : ["_", "_", "_", "_", "_"],
3 : ["_", "_", "_", "_", "_"],
2 : ["_", "_", "_", "_", "_"],
1 : ["_", "_", "_", "_", "_"]
}
def boardprint(colors):
global board
final = []
for x in range(len(board)):
spots = [f"\033[{col}m{board[x+1][idx]}\33[0m" for idx,col in enumerate(colors)]
l = ' '.join(spots)
final.append(f"| {l} |")
print('\n'.join(final))
colors = [31, 31, 31, 31, 31]
boardprint(colors)
如果您的终端/控制台识别这些代码,您会得到类似的东西(将其更改为red
代码,因为您的39
代码只是颜色重置。
如果您想使用rich
的模块,最好只使用它们的颜色代码。
import rich
board = {
6 : ["_", "_", "_", "_", "_"],
5 : ["_", "_", "_", "_", "_"],
4 : ["_", "_", "_", "_", "_"],
3 : ["_", "_", "_", "_", "_"],
2 : ["_", "_", "_", "_", "_"],
1 : ["_", "_", "_", "_", "_"]
}
def rich_boardprint(colors):
global board
final = []
for x in range(len(board)):
spots = [f"[{col}]{board[x+1][idx]}[/]" for idx,col in enumerate(colors)]
l = ' '.join(spots)
final.append(f"| {l} |")
rich.print('\n'.join(final))
rich_colors = ["red", "yellow", "blue", "magenta", "green"]
rich_boardprint(rich_colors)
这看起来像这样:
如果您想继续按原样使用 ANSI 代码,但使用rich.print
,您可以使用rich
库的一些附加功能将您从 ANSI 文本转换为它可以理解的内容,使用rich.text.Text.from_ansi
,像这样:
from rich.text import Text
board = {
6 : ["_", "_", "_", "_", "_"],
5 : ["_", "_", "_", "_", "_"],
4 : ["_", "_", "_", "_", "_"],
3 : ["_", "_", "_", "_", "_"],
2 : ["_", "_", "_", "_", "_"],
1 : ["_", "_", "_", "_", "_"]
}
def ansi_rich_boardprint(colors):
global board
final = []
for x in range(len(board)):
spots = [f"\033[{col}m{board[x+1][idx]}\33[0m" for idx,col in enumerate(colors)]
l = ' '.join(spots)
final.append(f"| {l} |")
ansi_rich = Text.from_ansi('\n'.join(final))
rich.print(ansi_rich)
colors = [31, 31, 31, 31, 31]
ansi_rich_boardprint(colors)
你会得到一个像第一个例子一样的图像,它只使用内置的print
:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.