初心者でも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」にすれば、ウィジェットを有効化することができます。

[↑ 目次へ]

動作内容

10回クリックしたら無効化されるボタンを作成していきます。

最初に、作成したアプリの外観を示します。

f:id:vigilantPotato:20190330225823j:plain

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

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

f:id:vigilantPotato:20190330225839j:plain

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

f:id:vigilantPotato:20190330225909j:plain

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

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を超えて増えていきます。

f:id:vigilantPotato:20190330230728j:plain

ボタンは無効化されましたが、クリックに反応して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()

[↑ 目次へ]