深入剖析 ANSI Terminal Colors 的 5 大技巧 | 用 Python 解鎖顏色的奥秘


ANSI 終端顏色控制(ANSI terminal colors)是一項強大的技術,能夠讓我們在終端中設置顏色,從而高效地顯示不同類型的信息、警告或錯誤。這些顏色控制能讓我們的終端輸出變得更具可視性,並使開發過程更加直觀。

ANSI Terminal Colors

簡介

ANSI(American National Standards Institute,美國國家標準協會)是負責制定和推動各種國家標準的機構,其中之一就是終端顏色控制標準。ANSI 轉義序列是一種用來在終端中控制顯示樣式(如顏色、字型、光標位置等)的技術。

然而,許多開發者可能對 ANSI 控制碼 ( ANSI Terminal Colors )的運作原理並不熟悉,也不知道如何利用它來優化終端的顯示。本文將深入解析 ANSI 終端顏色控制 的工作原理,並教你如何利用 Python 解鎖背景顏色的奥秘,讓你在終端中充分發揮顏色的威力。

ANSI Terminal Colors 的轉義序列

ANSI 轉義序列允許開發者以極高的精確度控制終端輸出的顯示效果。

ANSI 控制碼的基本結構

ESC[參數1;參數2;...m
  • ESC:轉義字符,表示為 \x1b 或 \033 ( 以 8 進制表示 )。
  • [:表示控制序列的起始。
  • 參數:定義樣式、顏色或其他控制選項。
  • m:結尾字符,表示樣式設置。

常見參數組合

功能前景色背景色樣式
黑色3040
紅色3141
綠色3242
黃色3343
藍色3444
加粗1
下劃線4

設定環境

在 Python 中 | 改變文字顏色

以下是如何在 Python 中使用 ANSI 控制碼輸出紅色文字的範例:

print("\033[31mThis is red text\033[0m")
  • \033[31m:設置前景色為紅色。
  • \033[0m:重置樣式,防止影響後續輸出。

在 Python 中 | 同時設置前景色與背景色

我們可以通過組合參數同時設置前景色和背景色:

print("\033[33;44mYellow text on a blue background\033[0m")

在 Python 中 | 動態設置顏色

為了更加靈活,可以編寫函數生成控制碼:

def styled_text(text, fg=None, bg=None):
    fg_code = f"3{fg}" if fg is not None else ""
    bg_code = f"4{bg}" if bg is not None else ""
    codes = ";".join(filter(None, [fg_code, bg_code]))
    return f"\033[{codes}m{text}\033[0m"

print(styled_text("Dynamic colors", fg=2, bg=5))  # Green text on a magenta background

在 Python 中 | 加入樣式效果

你還可以結合 加粗 和 下劃線 等效果:

print("\033[1;31mBold red text\033[0m")
print("\033[4;34mUnderlined blue text\033[0m")

顏色編號與範例

在 Unix 系統中,如 Linux 或 macOS,您可以完全使用 256 顏色模式。例如,您可以運行以下 Python 命令來查看所有 256 種背景顏色:

python3 -c "for i in range(256): print(f'\033[48;5;{i}m  \033[0m', end='' if (i+1)%16 else '\n')"

如果您在 Windows 上執行相同的代碼,您可能無法看到所有顏色,甚至有可能會有顏色顯示錯誤或不兼容的情況,或使用 PowerShell 和命令提示符開始支持顏色,但對 256 顏色的支持仍然可能存在一些限制,且並非所有版本的 Windows 終端都能完全兼容。

完整程式碼

完整 Python 程式碼,包含了 styled_text 函數,讓您可以更靈活地設定動態的文字顏色和背景顏色。這個函數接受三個參數:text(要顯示的文字)、fg(前景顏色代碼,對應顏色的數字)和 bg(背景顏色代碼,對應顏色的數字)。

# Function to apply styled text with dynamic foreground and background colors
def styled_text(text, fg=None, bg=None):
    fg_code = f"3{fg}" if fg is not None else ""
    bg_code = f"4{bg}" if bg is not None else ""
    codes = ";".join(filter(None, [fg_code, bg_code]))
    return f"\033[{codes}m{text}\033[0m"

# Example 1: Basic Text Colors
print("\033[31mThis text is red\033[0m")
print("\033[32mThis text is green\033[0m")
print("\033[34mThis text is blue\033[0m")

# Example 2: Background Colors
print("\033[41mThis text has a red background\033[0m")
print("\033[42mThis text has a green background\033[0m")
print("\033[44mThis text has a blue background\033[0m")

# Example 3: Text Styles (Bold, Underline)
print("\033[1mThis text is bold\033[0m")
print("\033[4mThis text is underlined\033[0m")

# Example 4: Combining Colors and Styles
print("\033[1;31;47mBold red text on white background\033[0m")
print("\033[4;32;43mUnderlined green text on yellow background\033[0m")

# Example 5: 256-Color Mode
print("256-Color Background Examples:")
for i in range(16, 32):
    print(f"\033[48;5;{i}m  {i:3}  \033[0m", end=" ")
print()  # Move to the next line

# Example 6: RGB True Color (24-bit)
print("\033[38;2;255;105;180mPink text\033[0m")
print("\033[48;2;70;130;180mText with Steel Blue background\033[0m")

# Example 7: Using the styled_text function with dynamic colors
print(styled_text("Dynamic colors", fg=2, bg=5))  # Green text on a magenta background

如果您想要在 Windows 平台上處理這些顏色並確保其在所有平台上都能正常運行,可以考慮使用 colorama 等庫來進行跨平台支持,但如果只在支持 ANSI 控制碼的終端上運行,則不需要任何額外的導入。

結論

ANSI 終端顏色控制 (ANSI terminal colors) 是提升終端可視化效果和交互體驗的有效工具。通過理解 ANSI 轉義序列,我們可以輕鬆地設置終端的顏色背景,並利用 Python 編程來實現這些顏色效果。無論是在錯誤報告、成功提示,還是創建動態顏色效果,這些技術都能顯著提升終端的可讀性和吸引力。

掌握這些技能,你將能夠在終端開發中實現更加靈活和富有表現力的顏色控制,讓你的開發環境變得更加高效和生動。