Pythonで状態に合わせてボタンの見た目を変える(Tkinter)
PythonにもGUIフレームワークがあるということで基本的なところを勉強した。こだわり始めるとキリがなく、Pythonの習得から外れていくので気を付けたい。
結果
チェックボックスでスタートボタンのアクティブ ⇔ グレーアウトをコントロール。処理中はスタートボタンをグレーアウト。実際には処理はWhile
でカウントアップしているだけ。ただ、その進捗をプログレスバーで表している。
※ストップボタンは表示しているだけ。スレッドの勉強をしてからストップ機能を実装する予定。
1段目:チェックボックスがFalseでボタンはグレーアウト。
2段目:チェックボックスがTrueでボタンがアクティブ。アクティブのときの背景色と文字色を表示。
3段目:ボタンにカーソルを重ねたとき、背景色と文字色を変更。
4段目:処理中。チェックボックスとボタンはグレーアウト。
5段目:プログレスが100%になったら、メッセージボックスを表示する。
6段目:メッセージボックスを閉じると、プログレスがクリアされる。
プログラム
# 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()
参考サイト
tkinterのさわり
Tkinter 使ってみよう - Python 入門
Tkinterを使ってファイル選択GUIを構築しよう | DS Hack
tkinter カラーチャート
File:TkInterColorCharts.png - dftwiki
Bottonのオプション一覧
【Tkinter】ボタン(Button)の使い方
BottonのBindとイベントシーケンス
Tkinter の bind とイベントシーケンス
ButtonのEnable/Disable
python - Disable / Enable Button in TKinter - Stack Overflow
【tkinter】ウィジェットを無効化する方法【Python】 - 初心者でもPythonを使ってみよう
CheckBoxのイベント連携
Python チェックボタンを動的に作成しボタンイベントと連携する(Checkbutton) | 鎖プログラム
Progressbarについて
【Python GUIサンプル】TkinterでProgressbar(プログレスバー)を使ってみる | エンジニアになりたいブログ
python - Setting `orient` keyword argument for Tkinter Scale widget results in NameError: name 'HORIZONTAL' is not defined - Stack Overflow
tkinter.ttk Progressbarの使い方 Python - 初心者でもPythonを使ってみよう