Что делают эти строчки?

Это только та часть кода, в которой я не понимаю и хочу разобраться. Сколько бы я не искал в инете и ютубе, всё как-то не так объясняют.

class Main(Frame):
    def __init__(self, root):
    super(Main, self).__init__(root)
    self.startUI()

ВЕСЬ КОД (ЕСЛИ НАДО)


from tkinter import *
import random as rdm
from PIL import ImageTk, Image


class Main(Frame): 

    def __init__(self, root):                                           
    super(Main, self).__init__(root)   
                                           
    self.startUI()

    def startUI(self):
        btn = Button(root, text="Камень", font=("Times New Roman", 15),
                     command=lambda x=1: self.btn_click(x))
        btn2 = Button(root, text="Ножницы", font=("Times New Roman", 15),
                      command=lambda x=2: self.btn_click(x))
        btn3 = Button(root, text="Бумага", font=("Times New Roman", 15),
                      command=lambda x=3: self.btn_click(x))

        btn.place(x=10, y=100, width=120, height=50)
        btn2.place(x=155, y=100, width=120, height=50)
        btn3.place(x=300, y=100, width=120, height=50)

        self.lbl = Label(root, text="Начало игры!", bg="white", font=("Times New Roman", 20, "bold"))
        self.lbl.place(x=150, y=25)

        self.win = self.drow = self.lose = 0

        self.lbl2 = Label(root, justify="left", font=("Times New Roman", 13),
                         text=f"Побед: {self.win}\nПроигрышей:"
                              f" {self.lose}\nНичей: {self.drow}",
                         bg="#FFF")
        self.lbl2.place(x=5, y=5)
        
# +++
        self.imgLabel = Label(root)    
        self.imgLabel.place(x=330, y=20, width=50, height=50)

    def btn_click(self, choise):
        comp_choise = rdm.randint(1, 3)

        if choise == comp_choise:
            self.drow += 1
            self.lbl.configure(text="Ничья")

            img = ImageTk.PhotoImage(Image.open("E:\PYTHON\QUIZ\XZ.jpg"))
            self.imgLabel.configure(image=img)
            self.imgLabel.image = img  
  
        elif choise == 1 and comp_choise == 2 \
                or choise == 2 and comp_choise == 3 \
                or choise == 3 and comp_choise == 1:
            self.win += 1
            self.lbl.configure(text="Победа")
          
            img = ImageTk.PhotoImage(Image.open("E:\PYTHON\QUIZ\Win.jpg"))
            self.imgLabel.configure(image=img)
            self.imgLabel.image = img  
        else:
            self.lose += 1
            self.lbl.configure(text="Проигрыш")

            img = ImageTk.PhotoImage(Image.open("E:\PYTHON\QUIZ\LOSE.jpg"))
            self.imgLabel.configure(image=img)
            self.imgLabel.image = img  
            
        self.lbl2.configure(text=f"Побед: {self.win}\nПроигрышей:"
                              f" {self.lose}\nНичей: {self.drow}")

        del comp_choise


if __name__ == '__main__':
    root = Tk()
    root.geometry("430x160+200+200")
    root.title("Камень, ножницы, бумага")
    root.resizable(False, False)
    root["bg"] = "#FFF"
    app = Main(root)
    app.pack()
    root.mainloop()




Ответы (2 шт):

Автор решения: Universall

Здесь создаётся класс, с наследованием от Frame(т.е. создаётся свой(кастомный) Frame, который можно будет использовать как и обычный, но при создании он уже будет заполнен тем, что вы напишете. Потом определяется метод __init__, который вызывается когда вы создаёте объект класса. Затем с помощью super(Main, self).__init__(root) дополняется __init__ класса Frame. Это означает, что вы как бы дописываете свой код, к тому, что уже есть у Frame в __init__. Подробнее можно почитать здесь. А после идёт код, который вы дописываете(в частности вызываете функцию self.startUI(), в которой наполняете Frame кнопками, виджетами и т.д). Надеюсь хотя бы немного помог

→ Ссылка
Автор решения: Алексей Белкин

Класс Frame Является предком класса Main.Все созданные объекты класса Main будут обладать свойствами(атрибутами и методами) класса Frame:

class Main(Frame):

Инициализация класса Main:

def __init__(self, root):

Переопределение у Класса Main метода __init__()(который должен был работать также как у класса Frame):

super(Main, self).__init__(root)

При инициализации объекта Main, сработает метод startUI(). Именно этим и будет инициализация объектов класса Main отличаться от инициализации объектов класса Frame:

self.startUI()
→ Ссылка