PysimpleGUI 超簡単プログレスバーの作り方

2021年6月20日

こんにちは、せつやです。

今回は、PysimpleGUIシリーズ第6弾として「プログレスバー」の作り方になります。
Pythonで実行中の処理の進捗度を可視化させたいという方は参考になると思いますので
是非みていってください。

PysimpleGUI プログレスバー完成サンプル画像

処理回数を入力し、実行ボタンを押すと下にあるプログレスバーが処理の進行度に合わせて動きます。

こんな感じのが作れるよ!コピーして使ってね💡

プログレスバーのレイアウト表記のコード

layout = [
           # プログレスバー
           [ sg.ProgressBar(100,
                      pad=((1,0),(0,0)),
                      orientation='h',
                      size=(15.2,16),
                      key='bar')],
         ]

解説付きコード

layout = [
           # プログレスバー
            # (1) プログレスバー最大値を設定
           [ sg.ProgressBar(100,
            # プログレスバーの前後の余白((左,右),(上,下)) 省略可
                      pad=((1,0),(0,0)),
            # (2) プログレスバーの向き('h'横バー) ('v'縦バー)
                      orientation='h',
            # (3) プログレスバーの大きさ(長さ,幅)
                      size=(15.2,16),
            # 識別キー
                      key='bar')],
         ]
(1) プログレスバー最大値を設定
[ sg.ProgressBar(100,

ここで設定した値がプログレスバーの最大値になります。
100を指定した場合、プログレスバーに100を与えるとバーが最後まで描画されます。
例えば、100を最大値に指定したプログレスバーに50を与えると
プログレスバーは丁度、真ん中まで描画されます。

(2) プログレスバーの向き
orientation='h',

プログレスバーの向きを、「横向き」か「縦向き」かを指定します。
横向きの場合「h」、縦向きの場合[v]を指定します。

(3) プログレスバーの大きさ
size=(15.2,16),

 プログレスバー本体の表示の大きさを設定できます。
 ※ size =(x,y),
 x : プログレスバーの長さ
 y : プログレスバーの太さ

ボタンの動作部分のコード

    if event == "button1":
        実行処理()

プログレスバーの組み込み方

def 実行処理():

    # (1) 入力ボックスから処理回数を取得
    処理数 = int(values['input1'])

    # (2) 1回の処理で、プログレスバーの進む深度を計算
    重み値 = 100 / 処理数

    # (3) プログレスバーの初期深度
    進捗値 = 0
    
    for i in range(処理数):

        # (4) プログレスバー進捗計算
        進捗値 = 進捗値 + 重み値

        # (5) プログレスバー描画更新
        window["bar"].update_bar(進捗値)
        window['label'].update(str(i+1).zfill(5)+"/"+str(処理数).zfill(5))

    # (6) 重み値の誤差補正用
    window["bar"].update_bar(100)   
Point

(1) 処理回数の最大値を取得します。
(2) プログレスバーの最大値を100として、1回の処理の深度を計算します。
(3) プログレスバーの最初の位置を指定しています。
(4) 処理が実行されるたびに、進捗値を加算しています。
その際、上記(2)で計算した1回の処理の深度を使用します。

(5) プログレスバーの描画を更新しています。
(6) 1回の処理深度の計算で端数がでた場合、描画が100%にならないため
その誤差を埋めを行っています。

Pythonでそのまま使えるサンプルコード

# coding: utf-8
# *************************************************************************************
# * PysimpleGUI プログレスバーの作り方
# *************************************************************************************
# *====================================================================================
# * インポートライブラリ
# *====================================================================================
# +-----------------------------------------------------------------------------------+
# + PySimpleGUI
# +-----------------------------------------------------------------------------------+
#(pip install pysimplegui)
import PySimpleGUI as sg

# +-----------------------------------------------------------------------------------+
# + PyAutoGUI
# +-----------------------------------------------------------------------------------+
#(pip install pyautogui)
import pyautogui as pg

# *====================================================================================
# * プログラム開始
# *====================================================================================
def 実行処理():

    # 入力ボックスから処理回数を取得
    処理数 = int(values['input1'])

    # 1回の処理で、プログレスバーの進む深度を計算
    重み値 = 100 / 処理数

    # プログレスバーの初期深度
    進捗値 = 0
    
    for i in range(処理数):

        # プログレスバー進捗計算
        進捗値 = 進捗値 + 重み値

        # プログレスバー更新
        window["bar"].update_bar(進捗値)
        window['label'].update(str(i+1).zfill(5)+"/"+str(処理数).zfill(5))

    # 重み値の誤差補正用
    window["bar"].update_bar(100)   

# *====================================================================================
# * GUI作成
# *====================================================================================
# +-----------------------------------------------------------------------------------+
# + スタイル設定
# +-----------------------------------------------------------------------------------+
sg.theme('Dark Blue 3')

# +-----------------------------------------------------------------------------------+
# + レイアウト設定
# +-----------------------------------------------------------------------------------+
layout = [
           # テキストラベル - 処理回数
           [ sg.Text('処理回数',
                     pad=((0,0),(0,0)),
                     font=('BIZ UDゴシック',10),
                     text_color=("#FFFFFF"))],

           # 入力ボックス - 処理回数
           [ sg.InputText("1000",
                     font=('BIZ UDゴシック',10),
                     pad=((0,0),(0,5)),
                     size=(30,0),
                     key='input1')],

           # テキストラベル - プログレスバー
           [ sg.Text('プログレスバー',
                     pad=((0,0),(0,0)),
                     font=('BIZ UDゴシック',10),
                     text_color=("#FFFFFF"))],

           # プログレスバー
           [ sg.ProgressBar(100,
                      pad=((1,0),(0,0)),
                      orientation='h',
                      size=(15.2,16),
                      key='bar')],

           # テキストラベル - カウント表記
           [ sg.Text("00000/00000",
               pad=((0,0),(0,1)),
                      font=('BIZ UDゴシック',10),
                      text_color=("#FFFFFF"),
                      key='label')],
           
           # ボタン - 処理開始
           [ sg.Submit(button_text='処理開始',
                      pad=((100,0),(0,0)),
                      font=('BIZ UDゴシック',10),
                      size=(15,1),
                      key='button1')]
         ]

# +-----------------------------------------------------------------------------------+
# + ウィンドウ作成
# +-----------------------------------------------------------------------------------+
window = sg.Window('プログレスバー',layout,size=(238,140))

# +-----------------------------------------------------------------------------------+
# + GUIループ
# +-----------------------------------------------------------------------------------+
while True:
    event, values = window.read()
    if event is None:
        break
    if event == "button1":
        実行処理()

Pythonをまとめて学びたい方は、まずは無料オンラインセミナーがおすすめ