Python独習!

習得したPython知識をペイフォワード

Pythonで状態に合わせてボタンの見た目を変える(Tkinter)

PythonにもGUIフレームワークがあるということで基本的なところを勉強した。こだわり始めるとキリがなく、Pythonの習得から外れていくので気を付けたい。

結果

チェックボックスでスタートボタンのアクティブ ⇔ グレーアウトをコントロール。処理中はスタートボタンをグレーアウト。実際には処理はWhileでカウントアップしているだけ。ただ、その進捗をプログレスバーで表している。
※ストップボタンは表示しているだけ。スレッドの勉強をしてからストップ機能を実装する予定。

1段目:チェックボックスがFalseでボタンはグレーアウト。
2段目:チェックボックスがTrueでボタンがアクティブ。アクティブのときの背景色と文字色を表示。
3段目:ボタンにカーソルを重ねたとき、背景色と文字色を変更。
4段目:処理中。チェックボックスとボタンはグレーアウト。
5段目:プログレスが100%になったら、メッセージボックスを表示する。
6段目:メッセージボックスを閉じると、プログレスがクリアされる。
f:id:greenhornprofessional:20200406194105j:plain

プログラム

# 22_tkinter_button_001.py
# python 3.8.1
# tkinter 8.6
# coding: utf-8
#
import tkinter as tk
from tkinter import ttk as ttk
from tkinter import messagebox as tkm
from tkinter import HORIZONTAL
from time import sleep

#プログレスバーの進捗度を保存する変数
prbval = 0

#サイズ350x80で固定のウィンドウ作成
root = tk.Tk()
root.title("Learning Buttons")
root.geometry('350x80')
root.resizable(width=False, height=False)

#スタートボタンの内容
def button_click():
    global prbval
    b1.configure(state=tk.DISABLED, bg='SystemButtonFace')
    chk1.configure(state=tk.DISABLED)

    try:
#       raise ZeroDivisionError
        while prbval <= 20:
            sleep(0.1)
            prbval = prbval + 1
            prb.configure(value = prbval)
            prb.update()                    #この1行がないとプログレスが描画されない
        tkm.showinfo("Info", "Complete")
    except:
        tkm.showerror("Error", "Unexpected error!!")
        pass

    prbval = 0
    prb.configure(value = prbval)
    b1.configure(state=tk.NORMAL, fg='Green4', bg='DarkSeaGreen1')
    chk1.configure(state=tk.NORMAL)

#スタートボタンにカーソルを重ねたときの挙動
def mouseOver(event):
    if b1['state'] == 'normal':
        b1.configure(fg='Snow', bg='Green2')
    else:
        return

#スタートボタンからカーソルを外したときの挙動
def mouseOut(event):
    if b1['state'] == 'normal':
        b1.configure(fg='Green4', bg='DarkSeaGreen1')
    else:
        return

#チェックボックスの内容
def switch(bln):
    if bln == True:
        b1.configure(state=tk.NORMAL, fg='Green4', bg='DarkSeaGreen1')
    else:
        b1.configure(state=tk.DISABLED, bg='SystemButtonFace')

#チェックボックスの状態を表す変数の定義
bln1 = tk.BooleanVar()
bln1.set(False)

#チェックボックス作成
chk1 = tk.Checkbutton(root, variable=bln1, text="Activate Buttons", command=lambda: switch(bln1.get()))
chk1.place(x=210, y=10)

#プログレスバー用のラベル作成
lb1 = tk.Label(text="Progress Bar")
lb1.place(x=10, y=12)

#プログレスバー作成
prb = ttk.Progressbar(root, orient=HORIZONTAL, length=200, mode='determinate')
prb.configure(maximum=20, value=prbval)
prb.place(x=10, y=40)

#スタートボタン作成、デフォルトがDISABLED
b1 = tk.Button(
    root,
    text = "Start",
    width = 7,
    state = tk.DISABLED,
    disabledforeground = 'Gray45',
    command = button_click
    )
b1.bind('<Enter>', mouseOver)
b1.bind('<Leave>', mouseOut)
b1.place(x=215, y=38)    

#ストップボタン作成
b2 = tk.Button(
    root,
    text = "Stop",
    width = 7,
    state = tk.DISABLED
    )
b2.place(x=280, y=38)

root.mainloop()
/* -----codeの行番号----- */