【Python tkinter】mainloop()とは?実際の働きと使い方を解説
2021.08.20 /
本記事ではPythonのtkinterによる、mainloopの使い方について解説していきます。
多くのサイトでmainloopについて詳しく説明していません。
そのためおまじないのようにスクリプトの最後に記載している人がほとんどだと思います。
mainloopについて知識を深めることで、よりユーザビリティが高いアプリケーションを作成できるようになります。
本記事を通して、tkinterのmainloopについて理解を深めていきましょう。
tkinter:mainloop
mainloopとは
Python tkinterのmainloopメソッドは、その名の通り「ループ」を実現するためのメソッドです。
この「ループ」は静止画面(GUIアプリの画面)を表示するために永遠と実行される無限ループです。
つまりmainloopのおかげでGUIアプリの画面が表示したままになっているということです。
そのためmainloopはtkinterで実行されるGUIアプリケーションの根底と言える重要なメソッドと言えます。
mainloopが記述されていないスクリプトでは、起動後一瞬で消えてしまうのはこのためですね。
ウィンドウの破棄と生成を繰り返している
Pythonスクリプトで生成されたアプリケーションウィンドウ(GUI画面)はmainloopメソッドにたどり着くと一旦破棄されます。
そして即座に新しいアプリケーションウィンドウが生成されます。
この一連の動きが非常に高速なため、人間の目には同じ画面がずっとそこにあるように見えているのです。
mainloopメソッドの実行
サンプルプログラム
以下にmainloop()メソッドを実行する簡単なスクリプトを記します。
import tkinter as tk
root = tk.Tk()
root.title("tkinterによるGUI画面作成")
root.geometry("300x100")
root.mainloop()
mainloop()メソッドのルール
mainloop()メソッドはプログラムコードの最終行に必ず記述されます。
すべてのウィジェットに対してmainloop()メソッドは使用できますが、基本的にメインウィンドウ(サンプルプログラムではroot)に対して実行されます。
root.mainloop()
mainloop()メソッドによるイベント実行
すでに説明していますがmainloop()メソッドの機能の1つに、ループを繰り返してGUI画面を表示し続ける、というものがあります。
これを言い換えると、mainloop()メソッドはなにかしらのイベント発生を待っていると言えます。
イベントとは、ユーザーによるボタンのクリックやマウス操作、キー入力などを指します。
このようなイベントが発生するまでmainloop()は同じ画面を表示し続けて待機しています。
ボタンのクリックなどのイベントが発生すると、イベントに紐づいた処理(関数)はmainloopで実行されます。
つまりイベント発生によって実行される処理(関数)は、mainloopが実行されるまで実行されないということです。
tkinterによるGUIアプリケーション作成時にはそこまで気にしなくてもいいことですが、作成するプログラムによっては意識する必要があります。
ちなみに私は今まで数多くのGUIアプリケーションを作成してきましたが、mainloopのこの機能を意識したことはこれまでありません。
mainloop()メソッドの外側のコードをブロック
スクリプトを実行しmainloop()メソッドを処理するとスクリプトの先頭に移動します。
そしてまたmainloop()までくると先頭に移動、これを永遠とループします。
そのためmainloop()より外側にあるプログラムはループが続いている限り実行されないです。(GUI画面を消し、mainloopから抜けることで実行されます)
import tkinter as tk
root = tk.Tk()
root.title("tkinterによるGUI画面作成")
root.geometry("300x100")
button = tk.Button(root, text="Exit", command=lambda:root.destroy())
button.pack()
root.mainloop()
# GUIアプリケーションを消した後に実行される
name = input('Enter your name ')
print('Good Morning ',name)
mainloopから抜ける方法
mainloopから抜ける方法として、Python tkinterにはdestroy()メソッドが用意されています。
destroy()メソッドはframeやcanvasなどの様々なウィジェットに対して実行できます。
以下にdestroy()メソッドを使用するスクリプト例を記します。
import tkinter as tk
root = tk.Tk()
root.title("tkinterによるGUI画面作成")
root.geometry("300x100")
button = tk.Button(root, text="Exit", command=lambda:root.destroy())
button.pack()
root.mainloop()
まとめ
本記事「【Python tkinter】mainloopとは?実際の動きと使い方を解説」はいかがでしたか。
多くの人がおまじないのようにmainloop()メソッドを使用していますが、この意味を知ることでtkinterをより深く理解できるようになります。
ぜひmainloop()も意識して今後はプログラムの作成をしてみてください。