初心者でもPythonを使ってみよう

趣味と実益を兼ねたPython学習記

【スポンサーリンク】



tkinter ウィジェットを無効化する方法 Python

tkinterの各ウィジェットを無効化する方法について、実際にアプリを作成しながらまとめました。

「Checkbutton」を用いた無効化例がこちらにあるので、参考にしてください。

目次

ウィジェットを無効化する方法

ウィジェットを無効化するには、オプションの「state」を「disable」に設定すれば可能です。

ボタンウィジェットを例に、オプションを「disable」に設定する例を2つ示します。

  • .configを使用する場合
b = tkinter.button()
b.config(state="disable")
  • 直接設定する場合
b = tkinter.button()
b["state"] = "disable"

また、オプションの「state」を「active」にすることでウィジェットを有効化することができます。

次は、実際に簡単なアプリを作成して使い方を確かめます。

アプリ概要

以下に、起動時の画面を示します。

f:id:vigilantPotato:20190330225823j:plain

ボタンが一つ生成されているだけの非常に単純な画面です。

ボタンをクリックすると、クリックした回数がタイトルに表示されていきます。

f:id:vigilantPotato:20190330225839j:plain

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

f:id:vigilantPotato:20190330225909j:plain

これ以上ボタンをクリックしても、ボタンを押すことはできず数字も変化しません。

ボタンの無効化が確認できました。

コードの解説

使用するモジュールはtkinterのみです。

import tkinter

次に、クリック数をカウントし、10になったら自らを無効化するボタンのクラスを作成します。クラス名は、「CountButton」としました。

class CountButton(tkinter.Button):  #1
    def __init__(self):
        super().__init__(master=None, text="Counter", width=10, command=self.count_click)   #2
        self.count_num = 0  #3

    def count_click(self):  #4
        self.count_num += 1 #5
        self.config(text=self.count_num)    #6
        if self.count_num == 10:    #7
            self.config(state="disable")    #8
  1. 「tkinter.Button」を継承
  2. ボタンのタイトル、サイズ、クリック時に実行するメソッドを設定
  3. クリックカウント用のインスタンス変数
  4. クリック時に実行するメソッド
  5. カウントを+1
  6. ボタンのタイトルを、クリック数に変更
  7. カウント数を判定
  8. 自らを無効化に設定

今回の例では、カウント数が10になった時に、self.config(state="disable")を用いて、自らを無効化に設定するようにしています。

最後に、「CountButton」クラスのインスタンスを生成し、表示させれば完了です。

if __name__ == "__main__":
    root = tkinter.Tk()
    b = CountButton()
    b.pack()
    root.mainloop()

アプリ概要(無効化されない例)

上記の例では、「command」オプションを用いて、「count_click」メソッドを呼び出していましたが、.bindを使って呼び出した場合、無効化が効きません。

以下に、.bindでメソッドを呼び出した場合の動作を示します。

基本的な動作は同じで、ボタンをクリックした回数だけボタンのタイトルの数字が加算され、カウントが10になると「state」オプションが「disable」に設定されてボタンのタイトルが灰色になります。

しかし、その状態でボタンをクリックすると、ボタンが押されたエフェクトは出ませんが、数字は10を超えて増えていきます。

f:id:vigilantPotato:20190330230728j:plain

ボタンは無効化されましたが、クリックに反応して「count_click」メソッドが実行されてしまっているためです。

コードの解説(無効化されない例)

無効化できない例について、変更を加えた「CountButton」クラスのみ解説します。

class CountButton(tkinter.Button):
    def __init__(self):
        super().__init__(master=None, text="Counter", width=10) #1
        self.bind("<Button-1>", self.count_click)   #2
        self.count_num = 0

    def count_click(self, event):   #3
        self.count_num += 1
        self.config(text=self.count_num)
        if self.count_num == 10:
            self.config(state="disable")
  1. 「command」オプションを削除
  2. .bindで、左クリック(<Button-1>)時に「count_click」メソッドを実行するように設定
  3. .bind用に、引数に「event」を追加

大きな変更は無く、「count_click」メソッドの呼び出し方法を「command」オプションから.bindに変更しただけです。

このように、ボタンの無効化を実施してもクリック時にメソッドが実行されてしまうことがあるため、.bindを使用する際には注意が必要です。

コード全文

  • 無効化例
import tkinter


class CountButton(tkinter.Button):
    def __init__(self):
        super().__init__(master=None, text="Counter", width=10, command=self.count_click)
        self.count_num = 0

    def count_click(self):
        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()
  • 無効化されない例
import tkinter


class CountButton(tkinter.Button):
    def __init__(self):
        super().__init__(master=None, text="Counter", width=10)
        self.bind("<Button-1>", self.count_click)
        self.count_num = 0

    def count_click(self, event):
        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()