はじめに
Pythonでtkinterを使っている時にエラーに遭遇しました。
実はあまりPythonでGUI系はほとんど触ったことがないので今回はその時に詰まった原因や手順などについてメモを残すことにしました。
サンプルプログラムや簡単なTkinterの解説も入れましたのでよければ参考にしてください。
Tkinterとは
まず簡単にTkinterについてです。
Tkinterは、Pythonの標準ライブラリの一部であり、グラフィカルユーザーインターフェース(GUI)を作成するためのライブラリです。Pythonで簡単なGUIを作成するためによく使用されます。
Tkinterは、Tcl/Tkという古くからあるGUIツールキットをPythonから利用できるようにするラッパーであり、マルチプラットフォーム対応で、Windows、macOS、Linuxなど、多くのシステムで使用することが可能です。
Tkinterを用いると、ウィンドウを開いたり、ボタンやテキストボックス、ラベル、スライダー、メニューなどのウィジェット(GUIの各要素)を作成したり、ユーザーからの入力を受け取ったりすることができます。また、イベント駆動型のプログラミングが可能で、ユーザーの操作(クリック、キー入力など)に応じてプログラムの動作を制御することができます。
TkinterはPythonでGUIを作るならよく使うものと覚えておけばいいかと思います。
次が発生したエラーについてです。
エラーの原因と対処法
エラー
まず発生したエラーですが、
_tkinter.TclError: invalid command name ".!toplevel.!text"
というものです。
日本語で訳すと
「_tkinter.TclError: 無効なコマンド名 “.!toplevel.!text”」
となります(”.!toplevel.!text”は状況によって表示される内容が異なります)
原因とサンプルソース
原因
このエラーは、PythonのTkinterライブラリを使用していて、存在しないまたは既に削除されたウィジェットにアクセスしようとしたときに発生します。
(例の)”.!toplevel.!text”部分はウィジェットの名前を指しており、このウィジェットは存在しないか、既に削除されているというエラーです。
エラーが発生するソースコード
次はエラーが発生するサンプルソースコードです。
import tkinter as tk
root = tk.Tk()
text_widget = tk.Text(root)
text_widget.pack()
text_widget.destroy() # ウィジェットを削除
# 削除されたウィジェットを参照しようとする
text_widget.insert(tk.END, "Hello")
root.mainloop()
text_widgetを作成していますが、6行目で削除してます。
そして9行目で削除しようとしたtext_widgetへアクセスして失敗エラーになっています。
修正したソースコード
次が修正を行ったコードです。
import tkinter as tk
root = tk.Tk()
text_widget = tk.Text(root)
text_widget.pack()
# ウィジェットが存在している間だけ操作する
text_widget.insert(tk.END, "Hello")
def on_close():
text_widget.destroy() # ウィンドウが閉じられたときにウィジェットを削除
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_close) # ウィンドウが閉じられたときにon_close関数を呼び出す
root.mainloop()
これで”Hello”と表示されたウィジェットが表示されると思います。
さいごに
今回はTkinterのウィジェットを表示する時に起きたエラーについてでした。
こうしてみると機械学習やAI、サイエンス系に強いPythonですが、なんでも出来ますね。
GUIはより良い言語があるかもしれませんが、簡単なGUI画面を作る時に知っていると便利そうですね。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。