繁体   English   中英

如何使用 function 使用 ANSI 代码格式化打印语句?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM