iT邦幫忙

6

如何用python print出彩色的字體

  • 分享至 

  • xImage
  •  

前言

當我們在寫程式的時候有時候要回傳變數或者一些資料時,偶爾會被列印出來密密麻麻的資訊給搞得暈頭轉向,與單調的黑白字體相比,彩色字體可以更好地區分不同的信息和提示,從而提高程式碼的可讀性和可維護性。在這邊我想分享一個小撇步,可以不安裝模組單純使用python的print函式搭配ANSI轉義序列去列印出彩色的字體!

ANSI轉義序列

ANSI轉義序列是一種用於控制輸出的特殊字符序列,它可以讓我們改變輸出的字體顏色、背景顏色、效果等。在python中,我們可以使用ANSI轉義序列來打印彩色字體。本人是使用pycharm開發程式,不同的IDE可能會有不同的效果,甚至可能會不支持使用ANSI轉義序列。另外在某些情況下,可能需要在終端模擬器中啟用顏色支持才能正常顯示彩色字體。

接下來來看看如何使用ANSI轉義序列吧,以下會提供一些ANSI轉義序列的寫法:

\033[0m:重置所有屬性,包括顏色和背景色。
\033[30m:設置字體顏色為黑色。
\033[31m:設置字體顏色為紅色。
\033[32m:設置字體顏色為綠色。
\033[33m:設置字體顏色為黃色。
\033[34m:設置字體顏色為藍色。
\033[35m:設置字體顏色為洋紅色。
\033[36m:設置字體顏色為青色。
\033[37m:設置字體顏色為白色。
\033[40m:設置背景色為黑色。
\033[41m:設置背景色為紅色。
\033[42m:設置背景色為綠色。
\033[43m:設置背景色為黃色。
\033[44m:設置背景色為藍色。
\033[45m:設置背景色為洋紅色。
\033[46m:設置背景色為青色。
\033[47m:設置背景色為白色。

具體如何使用呢?首先\033[代表ANSI轉義序列的開頭,在這之後可以增加不同的效果,每組數字都代表著一個效果,不同效果間可以直接使用數字標號後用;隔開,這樣就不用重複寫\033[...了。設定好後後面要加一個m。有效果的字體輸出完後最後記得要重製所有屬性使字體變成默認輸出。例如要設定字體顏色為紅色,背景為黑色就可以寫:

print('這是一般的字 \033[31;40m 這是字體顏色為紅色,背景為黑色 \033[0m 這是重製所有屬性變成一般的字了')

可以看到輸出如下
https://ithelp.ithome.com.tw/upload/images/20230322/20151029mPjNbtoHLW.png


另外也可以設定字體效果,目前我測試的效果如下:

0:默認
1:粗體(但其實看起來沒啥差別XD)
3:斜體
4:下底線
7:反白(背景顏色跟字體顏色交換)
9:刪除線

用法如下,在最一開始先設定字體的效果,接著一樣設定字體顏色為紅色,背景為黑色:

print('\033[9;31;40m 這是字體顏色為紅色,背景為黑色,還有刪除線 \033[0m')

https://ithelp.ithome.com.tw/upload/images/20230322/20151029JqCW2Y6L10.png

結語

以上是我在pycharm測試的ANSI轉義序列的用法,各位在寫程式時如果有需要依靠不同字體來標出重點的話都可以使用此方法~另外有測試出別的效果等也都歡迎討論。這個效果也能讓程式的輸出有更多樣化的選擇,也能更方便的察看程式執行間的一些重要訊息!

有不清楚或者有錯誤也歡迎指正~


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

1
ccutmis
iT邦高手 2 級 ‧ 2023-03-23 07:59:34

這個蠻實用的,謝謝分享! /images/emoticon/emoticon41.gif

3
jeffeux
iT邦新手 4 級 ‧ 2023-03-25 01:19:18

其實不只 Python,bash 或 C++ 甚至是 JavaScript(瀏覽器或 Node.js 都可以!)等等的程式語言也可以~例如

bash (terminal, 其實是 shell 也就是包括 zsh 等等都行)

echo "\033[33m"abc"\033[0m"

(這招在 Colab 上常常被我拿來排版)

C++

#include <iostream>

int main() {

    std::cout << "\033[1;31m" << "Hello" << "\033[0m" << std::endl;

    return 0;

}

JavaScript

console.log(
    "\033[1;31m" + "Hi" + "\033[0m"
);

再補充一個 Python tip:兩條以上的 string 在括號內預設是 concat,所以可以這樣寫:

print(
    "\033[1;31m"  # Red bold
    "我是紅色的粗體文字!"
    "\033[0m"     # return to default
)

最後由於我好像有點印象有個特效是用來閃爍的,因此補充一下 ChatGPT 補充的:

Session 1

ANSI Escape Code 中 [0 到 [9 這十個編號,分別代表不同的文字格式和顏色:

  • [0m:重置所有屬性
  • [1m:將文字設定為粗體
  • [2m:將文字設定為粗體(等同於 [1m)
  • [3m:將文字設定為斜體
  • [4m:將文字設定為下劃線
  • [5m:將文字設定為閃爍
  • [6m:將文字設定為閃爍(等同於 [5m)
  • [7m:將文字設定為反白
  • [8m:隱藏文字(不可見)
  • [9m:將文字設定為刪除線

其中,[2m 和 [6m 兩者的效果是相同的,都可以將文字設定為粗體;同樣的,[5m 和 [6m 也是效果相同的,都可以讓文字閃爍。

Session 2

在 ANSI Escape Code 中,[1m 和 [2m 兩個編號都可以用來設定文字為粗體。然而,它們在實現上有些微小的差異。

在一些終端機或顯示器上,[1m 可能會將文字設定為明顯的粗體,而 [2m 僅僅會將文字稍微加粗一點,但不會像 [1m 一樣強烈。這是因為 [1m 和 [2m 的設計初衷不同。[1m 是用來表示 "強調" 文字,也就是需要在文本中突出顯示的重要部分,而 [2m 則是用來提高文字的可讀性。

Session 3

在 ANSI Escape Code 中,[5m 和 [6m 兩個編號都可以用來設定文字閃爍。它們的差異在於,[5m 表示閃爍的速度比較慢,而 [6m 表示閃爍的速度比較快。

不過需要注意的是,一些現代的終端機或顯示器可能已經不再支援文字閃爍的功能,因此 [5m 和 [6m 的效果可能無法正確顯示。
如果你的終端機或顯示器不支援文字閃爍,那麼使用 [5m 或 [6m 可能只會將文字設定為略微變亮或變暗的效果,而不是真正的閃爍。在這種情況下,你可以考慮使用其他的文字效果,例如加粗、下劃線等等,來達到類似的視覺效果。

哇!非常詳細的解說,感謝您的補充。/images/emoticon/emoticon41.gif

我要留言

立即登入留言