田舎社会人のいろいろ学習記

Python、英語、その他いろいろ

【tkinter.ttk】Progressbarで処理中であることを表示する方法【Python】

f:id:vigilantPotato:20210613125840p:plain
Progressbarで時間のかかる処理をしている最中であることを示す例を示す。Progressbarの表示と他の処理を同時に実施させるために、threadingモジュールを使用する。Progressbarの基本的な使い方は、以下の記事を参照。


【スポンサーリンク】


threadingモジュールでProgressbarを表示

以下の例では、タイマー起動中に同時にプログレスバーを表示させて処理中であることを示している。threadingモジュールを用いてタイマー処理を別スレッドにしているため、平行してProgressbarの表示等、画面の更新処理を行うことができる。

import threading
import time
from tkinter import ttk
import tkinter


#5秒タイマー
def timer():
    p.start(5)          #プログレスバー開始
    for i in range(6):
        time.sleep(1)   #1秒待機
        b["text"] = i   #秒数表示
    p.stop()            #プログレスバー停止


#ボタンクリック時に実行する関数
def button_clicked():
    t = threading.Thread(target=timer)  #スレッド立ち上げ
    t.start()   #スレッド開始


root = tkinter.Tk()

#プログレスバー
p = ttk.Progressbar(
    root,
    mode="indeterminate",   #非確定的
    )
p.pack()

#ボタン
b = tkinter.Button(
    root,
    width=15,
    text="start",
    command=button_clicked,
    )
b.pack()


root.mainloop()

ボタンをクリックするとタイマーが起動し、同時にプログレスバーが動作開始する。5秒後、タイマーとプログレスバーが同時に停止する。

f:id:vigilantPotato:20210715002804p:plain
f:id:vigilantPotato:20210715002815p:plain

[↑ 目次へ]


【スポンサーリンク】


Progressbarが動かない例

以下の例のようにthreadingモジュールを使用しないと、タイマーループが完了するまで画面が更新されないため、プログレスバーが動作しない。

import time
from tkinter import ttk
import tkinter


#ボタンクリック時に実行する関数
def button_clicked():
    p.start(5)          #プログレスバー開始
    for i in range(6):
        time.sleep(1)   #1秒待機
        b["text"] = i   #秒数表示
    p.stop()            #プログレスバー停止


root = tkinter.Tk()

#プログレスバー
p = ttk.Progressbar(
    root,
    mode="indeterminate",
    )
p.pack()

#ボタン
b = tkinter.Button(
    root,
    width=15,
    text="start",
    command=button_clicked,
    )
b.pack()


root.mainloop()

[↑ 目次へ]


【スポンサーリンク】