おさかなさんの覚え書き

プログラミングが好きなおさかなさんです

Python3でプロセスバーを作ったり、ターミナル上の文字色や文字の装飾を変えるやり方

こちらに移転しました。

プロセスバー(進捗バー)を作る

for i in range(11):
    print(f"\r[{'#'*i}{(10-i)*' '}] {i*10}%",end="")
print()
 ここで重要なのは\rと末尾のend=""。 前者は先頭、後者はカンマ区切りで末尾につける必要があります。
 \rは復帰を示し、現在カーソルが合っている列の行頭までひっぱってくれる。その上に次の出力が来ると上書きされ、一行のみでプロセスバーを再現することが可能。
 end=""\rの効果を発揮するためのもの。本来print()単体では行末に改行がつけられているので、それを空の文字列に置き換えてカーソルを同じ行に存在させる。
 三行目の空のprint()は改行させることでプロセスバー以降のCUIが崩れないようにしている。

エモいプロセスバー(進捗バー)を作る

for i in range(0,101):
    progress = "\033[07m \033[0m"*(i//2)+" "*(50-i//2)
    p = (3-len(str(i)))*" "+str(i)
    print(f"\r{p}% |{progress}| ", end="")
 "\033[07m \033[0m"*i" "*100だと無駄に長い進捗バーになってしまうので、ゲージを50として"\033[07m \033[0m"*(i/2)" "*(50-i//2)としています。これを実行すると、半角スペースの背景色を反転させた、パーセンテージも表示されるプロセスバーになります。
 また、(3-len(str(i)))*" "+str(i)としたことでパーセンテージが上がるにつれてカクカクと動いてしまうことを防ぎます。

ターミナル上で文字色や文字装飾を変える

 文字色を変える方法にはライブラリを使うものがありますが、今回の解説では使用しません。素のままのPython3で実行できます。
print("\033[31m"+RED+"\033[0m")
 このコードではREDという文字列を赤色でターミナルに出力します。\033[31mが赤色の開始コードで、\033[0mは終了コードです。終了コードは文字色設定の終了にも使えます。
print(開始コード+変えたい文字列+終了コード)
 の構造が基本で、終了コードをつけなくても動作しますが、それ以降のターミナルを全てその開始コードで色付けしたり装飾してしまうため、つけておくことを推奨します。
 また、開始コードがprint("\033[31m"+"\033[1m"+"RED"+"\033[0m")のように複数あっても、一番近い終了コード一つで止まるので文字色や文字装飾を重ね付けする際には楽にやれそうですね。
# 重ね付け※下のコードのクラスを流用しています
print(Decorate.BOLD+Color.RED+BgColor.BLACK+"BoldRed+BgBlack"+Decorate.END)
 以下に文字色や文字装飾の指定に使えるコードを書いておきます。お好きに利用してください。
class Color:
    BLACK = "\033[30m"
    RED = "\033[31m"
    GREEN = "\033[32m"
    YELLOW = "\033[33m"
    BLUE = "\033[34m"
    WHITE = "\033[37m"
    END = "\033[39m" # 文字色のみの終了コード
class Decorate:
    BOLD = "\033[1m"
    UNDERLINE = "\033[4m"
    INVISIBLE = "\033[08m"
    REVERSE = "\033[07m"
    END = "\033[0m" # 全ての色指定や装飾の終了コード
class BgColor:
    BLACK = "\033[40m"
    RED = "\033[41m"
    GREEN = "\033[42m"
    YELLOW = "\033[43m"
    BLUE = "\033[44m"
    WHITE = "\033[47m"
    END = "\033[49m" # 背景色のみの終了コード
# 太字+文字色赤+"BoldRed"+文字色終了+"BOLD"+全て終了
print(Decorate.BOLD+Color.RED+"BoldRed"+Color.END+"BOLD"+Decorate.END) # テスト用
 以下のプログラムを利用することでrgb値での詳細な色指定コード(開始コードのみ)が容易に算出できます。こちらもお好きにどうぞ。
# 文字色指定
rgb = input("rgb値: ")
print(r"\033[38;2;{};{};{}m".format(rgb[0],rgb[1],rgb[2]))
# 背景色指定
rgb = input("rgb値: ")
print(r"\033[48;2;{};{};{}m".format(rgb[0],rgb[1],rgb[2]))

Narito Blog
Pythonでエスケープシーケンスを無視(無効化)するraw文字列 | note.nkmk.me
[python]print文で色をつけてみよう – 野村数学研究所

 まだ問題が解決していない場合、上記のサイト群が参考になる可能性があります。
 閲覧いただきありがとうございました。質問あるいは指摘などございましたらコメントをお願いします。

Python3 / Tkinter(Tcl/Tk) key_bind検証

 Mac/Windowsでのkey_bindの対応表を作りたくて作成した記事です。key_bindについての軽い解説もしているので、有効活用してくれる方がいれば嬉しいです! 対応表は筆者が眠いために未完成ですが、ちょっとずつ更新していきます

key_bindとは?

 簡単に言い表すなら、keyと動作を結びつけるものです。例えば、ゲームなどで矢印キーを押したら移動できたりコマンドを打てたりしますよね? 移動させる関数を矢印キーに結びつけることで、矢印キーを押せば移動できる、と言った動作を行わせることができます。

 また、条件を満たしていないとkey_bindが反応しないようにしたりすることもできます。それによって、RPGなどで戦闘中に移動はしない、と言ったものも再現できます。

bind_all

 bind_allは対象.bind_all(key, func)といった形で対象の全てに対する、設定されたkey入力に反応してくれます。

# root = tk.Tk()である場合に、windowがアクティブ状態の時にkeyが押されているか判断させたい時
root.bind_all(key, func)

 

tag_bind

tag_bindは対象.tag_bind(tag, key, func)といった形で対象の全てから指定したtagに対するkey入力に反応してくれます。画像などにタグ付けして扱いたい時にとても便利です

# canvas = tk.Canvas(width=横幅, height=縦幅)である場合に、canvas内のtag、'picture'へのクリックを判断させたい時
canvas.tag_bind('picture', '<button>', func)

 

key_bind対応表 Mac ver.

名称/外観 key
ABC...Zまでの一つのキー '<キーのアルファベット>'
矢印キー上/↑ '<Up>'
矢印キー右/→ '<Right>'
矢印キー下/↓ '<Down>'
矢印キー左/← '<Left>'
Enter / Return '<Return>'
Shift ⇧ '<Shift>'
Command ⌘ '<Command>'
Control ⌃ '<Control>'

Tkinter(Tcl/Tk)  .insertでtk.Textに文字を入れる/挿入場所の指定

(サンプルコード)

import tkinter as tk
root = tk.Tk()
root.title('tk.Text test')
txt1 = tk.Text(root, width=40, height=4)
txt1.pack()
root.mainloop()
 サンプルコードをそのまま適当なファイルに突っ込んで実行すれば、複数行入力できるtk.Textに何も書かれていない状態で出てくるかと思われます。
 そこで、文字制限をつけたり入力内容を書きたい方におすすめなのがこちら。

txt1.insert(1.1, u'文字制限があります')

 なんどもinsert()で設定しないのであれば、これで問題ありません。

 1.1 = 行.列

 です。行は1から始めるようにしておかないと、後々書き換えたりするときにあとから入れたのに先頭に来て首を傾げる羽目になります。