ある一定の条件で特定のウィジェットを使用できないようにしたいことがよくあります。
今回は、tkinterのボタンを無効化する方法について、実際にコードを作成しながらまとめました。
「Checkbutton」を用いた無効化例がこちらにあるので、参考にしてください。
【スポンサーリンク】
一定回数以上のクリックで無効化するボタン
ウィジェットの状態を切り替える方法
まずは、ウィジェットの状態(有効・無効)を切り替える方法について説明します。
オプション「state」を「disable」に設定することで、ウィジェットを無効化することができます。
ボタンウィジェットを例に、オプションを「disable」に設定する例を2つ示します。ボタン以外でも基本的に同じ方法で状態を切り替えることが可能です。
- configメソッドを使用する方法
b = tkinter.button()
b.config(state="disable")
- 直接設定する方法
b = tkinter.button() b["state"] = "disable"
また、オプション「state」を「active」にすれば、ウィジェットを有効化することができます。
動作内容
10回クリックしたら無効化されるボタンを作成していきます。
最初に、作成したアプリの外観を示します。

ボタンが一つ生成されているだけの非常に単純な画面です。
ボタンをクリックすると、クリックした回数がタイトルに表示されていきます。

クリックを続け、回数が10になるとボタンのタイトルが灰色に変化します。

これ以上ボタンをクリックしても、ボタンを押すことはできず数字も変化しません。
10回クリックでボタンが無効化されることが確認できました。
コードの説明
クリックカウント+無効化ボタンクラスの作成
クリック数をカウントし、10になったら自らを無効化するボタンのクラスを作成します。クラス名は、「CountButton」としました。
class CountButton(tkinter.Button): def __init__(self): #1 ボタンの設定 super().__init__( master=None, text="Counter", width=10, command=self.count_click ) self.count_num = 0 def count_click(self): #2 クリック時の動作 self.count_num += 1 self.config(text=self.count_num) if self.count_num == 10: self.config(state="disable")
tkinter.Buttonを継承したCountButtonクラスを作成し、ボタンにカウント機能と無効化機能を追加しています。
①ボタンの設定
super関数を用いて、継承元であるtkinter.Buttonの設定をしています。(super関数についてはこちらをご確認ください。)
Buttonのcommandオプションで、クリック時に実行するメソッドを指定しています。
②クリック時の動作
クリックごとにcount_numに1ずつ加算していきます。
また、ボタンにカウント数が表示され、10になった時に自らを無効化するように設定されています。
ボタンの生成
作成したCountButtonクラスのインスタンスを生成し、表示させれば完了です。
if __name__ == "__main__": root = tkinter.Tk() b = CountButton() b.pack() root.mainloop()
コード全体
import tkinter class CountButton(tkinter.Button): def __init__(self): #1 ボタンの設定 super().__init__( master=None, text="Counter", width=10, command=self.count_click ) self.count_num = 0 def count_click(self): #2 クリック時の動作 self.count_num += 1 self.config(text=self.count_num) if self.count_num == 10: self.config(state="disable") if __name__ == "__main__": root = tkinter.Tk() b = CountButton() b.pack() root.mainloop()
無効化できない例
上記の例ではボタンのcommandオプションを用いて、クリック時にcount_clickメソッドを呼び出すように設定していましたが、bindを使って呼び出した場合、無効化が効かないので注意が必要です。
実際に先ほどのアプリを修正して確認してみます。
動作内容
commandオプションではなく、bindで左クリック時にcount_clickメソッドを実行するように設定を変えてみます。
先ほどと同様に、ボタンをクリックした回数だけボタンのタイトルの数字が加算され、カウントが10になるとstateオプションがdisableに設定されてボタンのタイトルが灰色になります。
しかし、その状態でボタンをクリックすると、ボタンが押されたエフェクトは出ませんが、数字は10を超えて増えていきます。

ボタンは無効化されましたが、クリックに反応してcount_clickメソッドが実行されてしまっているためです。
コードの説明
無効化できない例について、変更を加えたCountButtonクラスのみ解説します。
class CountButton(tkinter.Button): def __init__(self): #1 ボタンの設定 super().__init__( master=None, text="Counter", width=10 ) self.bind("<Button-1>", self.count_click) self.count_num = 0 def count_click(self, event): #2 クリック時の動作 self.count_num += 1 self.config(text=self.count_num) if self.count_num == 10: self.config(state="disable")
①ボタンの設定
commandオプションではなく、bindを用いて左クリック時にcount_clickを実行するように設定しています。<Button-1>
は左クリックの意味です。
②クリック時の動作
メソッドにeventを引数として追加します。左クリックで発生するクリックイベントを取得し、count_clickを実行します。
コード全体
import tkinter class CountButton(tkinter.Button): def __init__(self): #1 ボタンの設定 super().__init__( master=None, text="Counter", width=10 ) self.bind("<Button-1>", self.count_click) self.count_num = 0 def count_click(self, event): #2 クリック時の動作 self.count_num += 1 self.config(text=self.count_num) if self.count_num == 10: self.config(state="disable") if __name__ == "__main__": root = tkinter.Tk() b = CountButton() b.pack() root.mainloop()