pythonのtk.Frameの使い方について


tk.Frameの使い方について、よく以下のような記述が紹介されています。

[code]

    import tkinter as tk
    
    class Application(tk.Frame):
        def __init__(self, master=None):
            super().__init__(master)
            self.master.geometry("300x200")
            frame = tk.Frame(self.master)
            frame.pack()
            canvas = tk.Canvas(frame, width=500, height=500, background="white")
            canvas.create_oval(200, 100, 10, 20, fill='black')
            canvas.pack()
    
    if __name__ == "__main__":
        root = tk.Tk()
        app = Application(master=root)
        app.mainloop()
    
[/code]

class Application(tk.Frame)  
の部分でtk.Frameの継承を行ってるんだと思いますが、  
ここの恩恵がどこで得られているのかわからず。

途中でframe =
tk.Frame(self.master)のように別でインスタンス化しているのであれば、継承しなくとも以下のような記述でも同じことができると思うのですが、継承する意味があるのか、どうも理解ができない状況です。

[code]

    import tkinter as t
    
    root = t.Tk()
    
    class APP:
        def __init__(self,widget):
            self.widget = widget
            self.inttt()
    
        def inttt(self):
            frame = t.Frame(self.widget)
            frame.pack()
    
            canvas = t.Canvas(frame,width=200,height=500,bg="white")
            canvas.pack()
    
    app = APP(root)
    
[/code]

どなたか上記の違いがわかるかたはいらっしゃいますか？  
よろしくお願いします。




`tk.Frame` クラスを継承している場合、以下の様に書くこともできます。

[code]

    import tkinter as tk
    
    class Application(tk.Frame):
        def __init__(self, master=None):
            super().__init__(master)
            self.master.geometry("300x200")
            self.pack()
            self.canvas = tk.Canvas(self, width=500, height=500, background="white")
            self.canvas.create_oval(200, 100, 10, 20, fill='black')
            self.canvas.pack()
    
    if __name__ == "__main__":
        root = tk.Tk()
        app = Application(master=root)
        app.mainloop()
    
[/code]

