at backyard

Color my life with the chaos of trouble.

tkinterでLabelのテキストを変更する方法

tkinterのLabelのテキストを変更する方法に関する備忘録。

Labelのテキストを変更する方法は簡単で、tk.Label で生成したLabelインスタンスtext 属性を変更することで、テキストを変更することができる。

具体的には

label["text"] = "変更後のテキスト"

といった形で変更可能。

tkinterでLabelのテキストを変更するサンプル

サンプルコードを下に記載する。

import tkinter as tk
from datetime import datetime

class App:

    def __init__(self, root):
        self.root = root
        root.title("Label text change sample")
        root.geometry("250x100")

        self.datetime_label = tk.Label(root, text="")
        self.datetime_label.pack()

        tk.Button(text="Display datetime", width=20, command=self.display_datetime).pack()
        root.mainloop()

    def display_datetime(self):
        self.datetime_label["text"] = datetime.now()


def main():
    root = tk.Tk()
    app = App(root)
    app.root.mainloop()


if __name__ == "__main__":
    main()

このコードを実行して、Display datetime ボタンを押すと、現在時刻がLabel上に表示される。

f:id:shinshin86:20220108212520g:plain
実際にこのアプリを動作させたところ

なお、こちらのコードはGitHubにも上げている。

github.com

Labelのテキストを変更する際に気をつけたいところ

これは個人的に一瞬ハマりかけたところなのだが、tkinterではLabelなどの生成時にメソッドチェーン的な形でpackgrid をつなげて書くことができる。

例えば下記のような形。
(上に貼ったサンプルコードの一部を引用している)

tk.Button(text="Display datetime", width=20, command=self.display_datetime).pack()

このように1行で書けるのは便利なので、ついついなんでもこう書いてしまいがちだが、このpackgrid などの返り値は NoneType であることに注意したい。

つまり、下記のように書くとエラーとなる。
(これも上のコード内の引用)

self.datetime_label = tk.Label(root, text="").pack()

こうやって書いてしまうと、self.datetime_label には LabelのインスタンスではなくNoneType が入るため、このままアプリを起動してボタンを押すと、

TypeError: 'NoneType' object does not support item assignment

というエラーが出てしまう。

一瞬なぜエラーになったのか分からなかったが、落ち着いて考えてみればNoneTypeが代入されてしまっているだけということに気づいた。

ついついメソッドチェーンで繋げて書くのは便利なので使いがちだが、こういう細かいところで気をつけていかねばと思った次第である。