O
O
onlooked2016-01-06 20:04:00
Python
onlooked, 2016-01-06 20:04:00

What does this simple code mean?

I am learning python. Here is a simple implementation of a GUI and a button using OOP. I can't figure out what this line means.

from tkinter import*
class Application(Frame):
  def __init__(self, master):
    super(Application, self).__init__(master)    #что делает эта строка, для чего она????? Разжуйте, пожалуйста.
    self.grid()
    self.create_widgets()
  def create_widgets(self):
    self.bttn = Button(self, text = '111')
    self.bttn.grid()
    
    
root = Tk()
root.title('Buttons')
root.geometry('200x85')

app = Application(root)

root.mainloop()

Answer the question

In order to leave comments, you need to log in

2 answer(s)
A
abcd0x00, 2016-01-07
@onlooked

Explanation

Когда делаешь
то Application - это твой самодельный класс, который делается из существующего класса Frame.
Это значит, что все объекты (экземпляры) класса Application будут двух типов одновременно - типа Application и типа Frame.
Когда делаешь
это значит, что ты у класса Application делаешь метод __init__. При этом у класса Frame есть свой собственный метод __init__. Эти методы могут полностью различаться.
Когда делаешь
ты создаёшь объект (экземпляр) класса Application. При этом ему в метод __init__ передаётся основное окно всей программы.
app имеет сразу два типа - самодельный Application (который ты сам сделал) и существующий Frame (который уже сделали до тебя). По правилам tkinter'а, когда ты создаёшь какое-нибудь окно, его надо прилеплять к основному (так можно давать команды сразу всему дереву окон, в котором одни окна прилеплены к другим, и всё это прилеплено к основному окну).
Так вот, чтобы было всё правильно, твой самодельный объект, который сделан из существущего оконного типа, нужно прилепить к основному окну. Но так как твой объект - самодельный и сам по себе окном не является, то внутри себя он должен обратиться к тому типу, который делает его окном, и передать ему основное окно программы, чтобы тот мог к нему прилепиться.
Понимаешь, у тебя app - это один объект как бы двух типов: один тип не делает ничего, в нём есть только свой __init__ и ещё там какой-то самодельный метод; а другой тип является окном со всеми методами и свойствами окна.
Поэтому, чтобы в своём самодельном типе что-то делать, ты обращается просто к его элементам. А чтобы в существующем типе что-то делать, ты к нему получаешь доступ через super() (от слова суперкласс), а потом обращаешься к своим же элементам но через методы другого типа.
Therefore, the entry
Means that you need to take the __init__ method from the Frame base class and pass the master argument passed to __init__ of the Application derived class into it.
The super() function, as it were, searches for the base class of the Application class and returns it, and then there is a call to the __init__ method of this found class.

V
Vitaly, 2016-01-06
@denshi

I'll add an example to the other answer. This is pretty much the same thing:

class Ancestor(object):
    def method(self):
        print("Hello from", self)

class Descendant(Ancestor):
    def __init__(self):
        super(Descendant, self).method()

class Descendant2(Ancestor):
    def __init__(self):
        super().method()

class Descendant3(Ancestor):
    def __init__(self):
        Ancestor.method(self)

d = Descendant()
d2 = Descendant2()
d3 = Descendant3()

Hello from <__main__.Descendant object at 0x00F2FAD0>
Hello from <__main__.Descendant2 object at 0x00F2FB70>
Hello from <__main__.Descendant3 object at 0x00F2FB50>

upd: The second option (super without arguments) only works in Python 3.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question