初心者でもPythonを使ってみよう

趣味と実益を兼ねたPython学習記

【スポンサーリンク】



tkinter.ttk Progressbarの使い方 Python

tkinter.ttkで利用できる、Progressbarの使い方を、実際にコードを書きながらまとめました。

目次

Progressbarの概要

Progressbarは、処理の進捗状況を可視化するためのウィジェットです。

アプリ内で何かしら時間のかかる処理をしていることを知らせるときや、あとどのくらいで処理が完了するかを視覚化することができます。

以下に、ttkで生成したProgressbarの外観を示します。

f:id:vigilantPotato:20181229181150j:plain

この例では、プログレスバーが左右に動いて、現在処理中であることを示しています。

プログレスバーには、以下の2種類があります。

  1. ユーザーに処理中であることを視覚的に伝える
  2. ユーザーに処理の進捗度を視覚的に伝える

似たような内容ですが、1は処理がいつ終わるのか不明だが、ユーザーに処理中であることを伝えるため、2は処理が完了するタイミングが明確で、現在どこまで来ているかをユーザーに伝えるためのアプリになります。

前者が非確定的(indeterminate)、後者が確定的(determinate)と呼ばれいて、「code」オプションを用いて設定することが可能です。

それぞれについて、実際に簡単なアプリを作成して使い方を確認していきます。

アプリ概要(非確定的)

まずは、非確定的プログレスバーを用いて、スタートボタンを押すとバーが動き出し、ストップボタンで停止させるようにします。

まずは、完成したアプリの起動時の画面を示します。

f:id:vigilantPotato:20181229181150j:plain

上からプログレスバー、スタートボタン、ストップボタンが並んでいます。

スタートボタンを押すと、プログレスバーの緑の部分が左右に動き、処理中であることを示します。

これはストップボタンを押すまで止まりません。

コードの解説(非確定的)

まずはモジュールのインポートです。

tkinterとttkをインポートしましょう。

import tkinter
from tkinter import ttk

次に、プログレスバーとボタン二つを生成するクラス「TestProgressbar」を作成します。

「TestProgressbar」クラスには、ラベルフレームを継承させています。

class TestProgressbar(ttk.LabelFrame):
    def __init__(self, master=None):
        super().__init__(master, text="Progressbar")
        #progressbar
        self.progress = ttk.Progressbar(self)
        self.progress.configure(
            value=0,
            mode='indeterminate',
            maximum=100
            )
        self.progress.pack()
        #start button
        self.start_button = ttk.Button(self, command=self.startbar, text='start!')
        self.start_button.pack()
        #stop button
        self.stop_button = ttk.Button(self, command=self.stopbar, text='stop!')
        self.stop_button.pack()

    def startbar(self):
        self.progress.start(interval=10)

    def stopbar(self):
        self.progress.stop()

このうち、以下の箇所がProgressbarに関するコードです。

#progressbar
self.progress = ttk.Progressbar(self) #1
self.progress.configure( #2
    value=0,
    mode='indeterminate',
    maximum=100
    )
self.progress.pack()
  1. プログレスバーを生成
  2. プログレスバーの設定 初期値(value)はゼロ、最大(maximum)は100、モードは非確定的(indeterminate)

次に、スタートボタンを押したときに実行される、startbarメソッドを見ていきます。

def startbar(self):
    self.progress.start(interval=10)

self.progress.start(interval=10)プログレスバーを起動させるコマンドです。

オプションintervalはバーの動くスピードを設定するパラメーターで、interval=10では10msecごとに「value」を1増やしていきます。

デフォルトではinterval=50です。数字を減らすと早くなり、増やすと遅くなるので、適切に調整しましょう。

最後に、ストップボタンを押したときに実行されるstopbarメソッドです。

def stopbar(self):
    self.progress.stop()

ここでは、self.progress.stop()を実行してProgressbarを停止させています。

最後に上記クラスのオブジェクトを生成して完成です。

if __name__ == "__main__":
    root = tkinter.Tk()
    f = TestProgressbar(master=root)
    f.pack()
    root.mainloop()

アプリ概要(確定的)

次は確定的プログレスバーを用いて、スタートボタンを押すとバーが動き出し、バーが右端に到達すると停止するアプリを作成します。

完成したアプリの起動時の画面を示します。

f:id:vigilantPotato:20181229190114j:plain

今回は、進捗がmaxになると自動で止まるため、ストップボタンはありません。

スタートボタンを押すと、プログレスバーが動き出して、右側端に到達すると停止します。

f:id:vigilantPotato:20181229190221j:plain

コードの解説(確定的)

基本的には1と同じなので、変更点のみを記載します。

まず、進捗を表現するために、timeモジュールのsleep機能を使いたいので、timeモジュールを追加でインポートしてください。

import tkinter
from tkinter import ttk
import time    #追加

次に、プログレスバーの「mode」オプションを「determinate」に修正します。

self.progress.configure(
    value=0,
    mode='determinate',    #修正
    maximum=100
    )

最後はstartbarメソッドの修正です。

def startbar(self):
    i = 1
    while i <= 100:
        self.progress.configure(value=i)
        self.progress.update()
        i = i + 1
        time.sleep(0.02)

whileループを使ってvalueを1から100まで1ずつ増やしていくことで、Progressbarを進めていきます。

但し、self.progress.update()を入れないと、画面の更新がされないので必ず入れてください。

また、そのままでは一瞬で終わってしまうので、time.sleep(0.02)を入れてゆっくりProgressbarが進むようにしています。

コード全文

1 非確定的プログレスバー

import tkinter
from tkinter import ttk

class TestProgressbar(ttk.LabelFrame):
    def __init__(self, master=None):
        super().__init__(master, text="Progressbar")
        #progressbar
        self.progress = ttk.Progressbar(self)
        self.progress.configure(
            value=0,
            mode='indeterminate',
            maximum=100
            )
        self.progress.pack()
        #start button
        self.start_button = ttk.Button(self, command=self.startbar, text='start!')
        self.start_button.pack()
        #stop button
        self.stop_button = ttk.Button(self, command=self.stopbar, text='stop!')
        self.stop_button.pack()

    def startbar(self):
        self.progress.start(interval=10)
        
    def stopbar(self):
        self.progress.stop()


if __name__ == "__main__":
    root = tkinter.Tk()
    f = TestProgressbar(master=root)
    f.pack()
    root.mainloop()

2 確定的プログレスバー

import tkinter
from tkinter import ttk
import time

class TestProgressbar(ttk.LabelFrame):
    def __init__(self, master=None):
        super().__init__(master, text="Progressbar")
        #progressbar
        self.progress = ttk.Progressbar(self)
        self.progress.configure(
            value=0,
            mode='determinate',
            maximum=100
            )
        self.progress.pack()
        #start button
        self.start_button = ttk.Button(self, command=self.startbar, text='start!')
        self.start_button.pack()

    def startbar(self):
        i = 1
        while i <= 100:
            self.progress.configure(value=i)
            self.progress.update()
            i = i + 1
            time.sleep(0.02)


if __name__ == "__main__":
    root = tkinter.Tk()
    f = TestProgressbar(master=root)
    f.pack()
    root.mainloop()