tkinterのsuper().__init__(master)ってなんだ
初めてtkinterでGUIアプリを作成しようとした時、参考にするサイトで
super().__init__(master)
という行を見かけました。
始めは「なんだこれ!わかんねぇ!」ってなっていたけど微妙に理解したので脳内メモがてらこの記事を書きます。
厳密にはちょいちょい違うかもしれないけど大雑把に、といういうことで、、
super()ってなんだ
super()
っていうのは、
super().親クラスのメソッド
って書くことで継承した親クラスのメソッドを使えるようになる、というもの。
そして__init__()
はクラスのコンストラクタ。コンストラクタというのはクラスの生成時に実行されるメソッド。
いらんと思いつつ一応超大雑把に説明すると、
- クラス
- ・関数群みたいな感じ
- メソッド
- ・クラスの関数群のその一つ一つ
って感じ
つまり
super().__init__(master)
は継承した親クラスのコンストラクタに引数master
を渡して実行しているという事。
もう少しコードを思い出す
「よく見かけたコード」をもう少し思い出してみる。大体こんな感じ。
import tkinter as tk
class Window(tk.Frame):
def __init__(self,master):
super().__init__(master)
self.pack()
root = tk.Tk()
window = Window(root)
root.mainloop()
参考にしたサイトによるけど大本はこんな感じなはず。多分。
何継承してるんだ
-
Window
クラスはtk.Frame
を継承している。 -
tk.Frame
はtkinterのFrameというものを指している。
あれ?
ここでtkinterでFrameを使うときを思い出してみる。
tk.Frame(ウインドウオブジェクト)
みたいなこと書かなかったっけ。しかもこれ、tkinterのFrame
クラスのインスタンスを作ってるってことだよな?ここでFrame
クラスのコンストラクタが呼び出されてるっぽい。
つまりsuper().__init__(master)とは?
つまり、tk.Frame
を継承したクラス内での
super().__init__(master)
は
tk.Frame(master)
と同じってことか!
master
も、ウインドウオブジェクトtk.Tk()
に名前つけただけっぽいね。
おまけ
Window
クラスでのself
はFrameと思って大丈夫(っぽい)です。
上のサンプルコードの一部を
super().__init__(master,width=500,height=500,bg="beige")
self.pack()
に書き換えて、色のついた部分を見ればわかると思います。