Tkinter

[Python/tkinter] ttk.Progressbarで進捗状況を表示しよう!色やスタイルの変更方法も解説!

本記事では、
プログレスバーの基本的な使い方
外観(色)の指定方法
について分かりやすく解説していきます!

ttk モジュールでは、「画像のダウンロード中の進捗」や「アンケートの回答進捗率」などの時間のかかる作業の進捗を視覚的にみられるようにした プログレスバー を表示させることができます。

では実際に、プログレスバーを作成する方法を紹介していきます!

ブックマークするといつでも確認できます!

プログレスバーの種類

プログレスバーには「確定的プログレスバー」と「非確定的プログレスバー」があります。

それぞれの特徴について紹介していきます!

確定的プログレスバー

確定的プログレスバーは、現在の進捗を割合として表示させるスタイルです。
進捗具合を目視で判断できるので使い勝手が良いです!

progressbar-image1
すらいむ管理人

確定的プログレスバー”は、処理が進行している感じを表現したいときに有用ですね!

非確定的プログレスバー

非確定的プログレスバーは、どの程度処理が進んでいるのか表示させることはできません。
処理の進捗具合に関係なく時間経過とともに左右に動き続けます

progressbar-image2
すらいむ管理人

こちらの”非確定的プログレスバー”では、処理が実行中であることだけが伝わる表現の仕方ですね!

確定的プログレスバーを使ってみよう

実際に確定的プログレスバーを使ってみましょう。

今回は、「ボタンを10回クリックすると処理が完了するプログラム」を作成してみます。
以下のコードを実行してボタンをクリックしてみて下さい。

するとボタンをクリックしていく毎に、プログレスバーの割合が増えていくことが分かると思います。これが 確定的プログレスバー です。

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

def main():
    #確定的Progressbarの設置
    pb=ttk.Progressbar(root,maximum=100,mode="determinate",variable=var)
    pb.pack()
    #カウントアップボタンの設置
    count_btn=tk.Button(root,text="カウント + ",command=countUp)
    count_btn.pack()
    #カウントダウンボタンの配置
    count_btn=tk.Button(root,text="カウント - ",command=countDown)
    count_btn.pack()
    root.mainloop()

def countUp():
    if var.get()==100:
        messagebox.showinfo("Info","処理が完了しました!")
    if var.get()<100:
        var.set(var.get()+10)

def countDown():
    if var.get()!=0:
        var.set(var.get()-10)

if __name__=="__main__":
    root=tk.Tk()
    root.geometry("250x100")
    var = tk.IntVar()
    main()

ここで ttk.progressbar() の引数について説明します。

    pb=ttk.Progressbar(root,maximum=100,mode="determinate",variable=var)

root親ウィジェットを指定
maximumプログレスバーの最大値を指定
(本プログラムでは100を最大値として指定)
mode確定的(determinate)
非確定的(indeterminate)
上記どちらかを指定
variable変数の型を指定
(基本的には、整数を扱うのでIntVar()になる)

その他のオプションについては「ttk.progressbarオプション」項目で紹介します。

仕事がはかどるおすすめ参考書

非確定的プログレスバーを使ってみよう

次は実際に非確定的プログレスバーを使ってみましょう。

以下のコードを実行してみて下さい。
今回は、ttk.progressbar の mode を ” indeterminate ” に変更します。

するとプログレスバーのゲージが左右に動き続けているのが分かると思います。
これが 非確定的プログレスバー です。

import tkinter as tk
from tkinter import ttk

def main():
    #確定的Progressbarの設置
    pb=ttk.Progressbar(root,maximum=100,mode="indeterminate",variable=var)
    pb.pack()
    pb.start(interval=10)
    root.mainloop()

if __name__=="__main__":
    root=tk.Tk()
    root.geometry("150x70")
    var = tk.IntVar()
    main()

Proguressbarのデザインを変更する

すらいむ管理人

次に、Progressbarの色を変更してみましょう。

色を変更する場合にはttk.Styleを利用します。色を変更するためのステップは以下の通りです。色を変更させたい場合は、ttk.style()でスタイルを設定してあげる必要があります。

  1. styleインスタンスの作成
  2. Progressbarの外観(テーマ)変更
  3. styleで外観設定(ここで背景や枠線の色を変更)

スタイルを変更すると、そのスタイルに合わせたプログラスバーの表示形式に変わるのでデザインに合ったスタイルを選ぶと良いです。

使用可能なstyleを確認する

使用できるstyleは、style.theme_names()を使用することによって一覧を確認することができます!

下記のプログラムを実行するとコンソール上に使用可能なstyleが表示されます

import tkinter as tk
from tkinter import ttk

#使用可能なstyleの確認
style=ttk.Style()
print(style.theme_names())

使用可能なstyleの例
  • default
  • winnative
  • clam
  • alt
  • classic
  • vista
  • xpnative

styleを変更する

では実際にプログラスバーのstyleを変更してみます。
実際に変更する場合は、“style.theme_use()”を用いて指定します。

実際にデフォルトのまま使用する場合のプログラムを下記に示します。

windows」と「mac」では使用できるstyleに違いがあるかもしれません

■デフォルトのまま使用する場合

import tkinter as tk
from tkinter import ttk

def main():
    #styleの作成
    style=ttk.Style()
    style.theme_use()
    style.configure("Horizontal.TProgressbar")
    #確定的Progressbarの設置
    pb=ttk.Progressbar(root,
                       maximum=100,
                       mode="indeterminate",
                       variable=var,
                       style="Horizontal.TProgressbar")
    pb.pack()
    pb.start(interval=10)
    root.mainloop()

if __name__=="__main__":
    root=tk.Tk()
    root.geometry("250x100")
    var = tk.IntVar()
    main()

(実行結果)

progressbar_normal

その他のstyleについても実際に適用してみました!

■default

style.theme_use("default")

progressbar_default

■winnative

style.theme_use("winnative")

progressbar_winnative

■alt

style.theme_use("alt")

progressbar_alt

■vista

style.theme_use("vista")

progressbar_vista

■clam

style.theme_use("clam")

progressbar_clam

■classic

style.theme_use("classic")

progressbar_classic

■xpnative

style.theme_use("xpnative")

progressbar_xpnative

■使用できるstyleが少ない場合の対処法

すらいむ管理人

使用できるstyleが少ない場合には、ttkthemesというパッケージをインストールすると使えるようになるみたいです!

ttkthemesをインストールするためには、コマンドプロンプトで下記コマンドを実行すると追加できます。

>> pip install ttkthemes

styleで設定できる外観(背景、枠線など)

ttk.styleで、変更できる外観一覧は以下の通りです。

background Progressbarの色を指定
bordercolor 枠線を指定
darkcolor 右下に影を表示し、その色を指定
lightcolor 左上に影を表示し、その色を指定
troughcolor Progressbarの背景色を指定

これらのオプションは、先に示したプログラム上“style.configure()” メソッドに追加して使います。
(option1, option2, option3…に追加したいオプションを指定していく)

style.configure("Horizontal.TProgressbar", option1, option2, option3,...)

実際にそれぞれのオプションを変更してみた結果は以下のようになりました!

■background

style.configure("Horizontal.TProgressbar", background="red")

progressbar-image6
background=”red”

■darkcolor

style.configure("Horizontal.TProgressbar", darkcolor="red")

progressbar-image8
darkcolor=”red”

■troughcolor

style.configure("Horizontal.TProgressbar", troughcolor="red")

progressbar-image10
troughcolor=”skyblue”

■bordercolor

style.configure("Horizontal.TProgressbar", bordercolor="red")

progressbar-image7
bordercolor=”red”

■lightcolor

style.configure("Horizontal.TProgressbar", lightcolor="red")

progressbar-image9
lightcolor=”red”

好きな色を選択したい場合にはこちらの記事を参考にしてみて下さい!

参考:[Pythonで使える]カラーコード一覧

スポンサーリンク

ttk.progressbarのオプション

ttk.progressbar の主なオプション一覧を以下の表に示します。

オプション動作
modeモード選択( 確定的:determinate , 非確定的:indeterminate )
orientプログレスバーの方向( 水平:horizontal , 垂直:vertical )
lengthプログレスバーの長さ(デフォルトは100)
value現在値の指定
maximum最大値(デフォルト指定は100)
variable扱いたい変数の状態を指定
cursorマウスホバー時のマウス形状の指定
styleProgressbarの外観指定

orient の使用例

progressbar-image11

length の使用例

progressbar-image12

ttk.progressbarのメソッド

ttk.progressbar の主なメソッド一覧を以下の表に示します。

メソッド動作
.start ()自動増加モードを指定。引数に増加の間隔を ミリ秒 で指定。
.step ()引数には value を増加させる幅を指定。
.stop ()停止させる場合に呼び出す。自動増加モードの終了。

.start()

.sart()メソッドを使うとプログレスバーのバーが動く速度を変更することができます。

import tkinter as tk
from tkinter import ttk

def main():
    #確定的Progressbarの設置
    label=tk.Label(text=".start(interval=10)")
    label.pack()
    pb1=ttk.Progressbar(root,
                       maximum=100,
                       mode="indeterminate",
                       variable=var1)
    pb1.pack()
    pb1.start(interval=10)
    label2=tk.Label(text=".start(interval=50)")
    label2.pack()
    pb2=ttk.Progressbar(root,
                       maximum=100,
                       mode="indeterminate",
                       variable=var2)
    pb2.pack()
    pb2.start(interval=50)
    root.mainloop()

if __name__=="__main__":
    root=tk.Tk()
    root.geometry("250x120")
    var1 = tk.IntVar()
    var2 = tk.IntVar()
    main()

.step()

.step()メソッドを指定するとプログレスバーのバーの位置を指定することができます。

pb1=ttk.Progressbar(root,...)
pb1.step(10)
pb1.pack()
pb2=ttk.Progressbar(root,...)
pb2.step(50)
pb2.pack()

progressbar_step

.stop()

.stop()メソッドを用いるとプログレスバーの動きを停止させられます。

import tkinter as tk
from tkinter import ttk

def main():
    #確定的Progressbarの設置
    label=tk.Label()
    label.pack()
    pb=ttk.Progressbar(root,
                       maximum=100,
                       mode="indeterminate",
                       variable=var)
    pb.pack()
    pb.start(interval=10)
    button=tk.Button(text="stop", command=lambda: stop_button(pb))
    button.pack()
    root.mainloop()

def stop_button(pb):
    pb.stop()

if __name__=="__main__":
    root=tk.Tk()
    root.geometry("250x120")
    var = tk.IntVar()
    main()

仕事がはかどるおすすめ参考書

複数の処理をまとめて実行させたいとき

プログレスバーに複数の処理・イベントをまとめて実行させたい場合はコチラの記事を参考にしてみてください!

[python/tkinter] クリックイベントに引数を渡す / 複数処理を実行してみよう!tkinterで配置したボタンのクリックイベントに、複数の関数をバインドする方法を解説しています。また、ボタンクリック時に関数へ引数を渡す方法についても解説しています! oython tkinter bind() Button() command add...

以上となります。最後まで見ていただきありがとうございました!

ブックマークするといつでも確認できます!

プログラミング学習に役立つ厳選したおすすめ書籍プログラミングスクールも紹介していますので是非参考にしてみてください!

参考:優良プログラミングスクールランキング!選び方も紹介しています。

参考:Python学習に役立つ参考書厳選9冊!