Анализ и понимание фрагмента кода tkinter - PullRequest
0 голосов
/ 01 марта 2019

Я Брайан!У меня есть некоторый опыт работы с Python 2, 3 и tkinter.Тем не менее, я никогда не мог полностью понять, как этот общий кусок кода tkinter используется большинством программистов на python, использующих модуль tkinter:

Чтобы убедиться, что у меня есть подходящие ответы от людей, этот вопрос касается следующих тем: Классы, Наследование, встроенная функция super () и "master" родительские функции в tkinter . Они уже включены в раздел тегов.


Код

Я знаю, что это скучно, но для ответа на вопрос мне нужно дать вамчеткое представление о том, что я ищу, подразумевая, что этот вопрос касается понимания кода / рассуждения.

Мы начнем с этого кода:

import tkinter as tk

class App(tk.Frame):
    def __init__(self,master):
        super().__init__(master)

        self.lbl = Label(master,text="This is a label sample.")
        self.lbl.pack()

root = tk.Tk()
program = App(root)
program.mainloop()

И наша цель - понять, что важно/ роль в переопределении родительского класса init () с указанным "master", если все наши внутренние виджеты не будут точно иметь класс родительского класса в качестве своего мастера, вместо tkinter Tk ()объект.(Вы лучше поймете предложение с анализом).

Анализ

Код начинается с утверждения import tkinter as tk.Затем мы можем использовать пространство имен tk в качестве ссылки на модуль tkinter.

IMAGE001

В следующей строке объявляется новый класс с именем "App",который становится потомком и наследует методы "tk.Frame".

IMAGE002

Принимая в качестве ссылки код (для более легкого понимания):

root = tk.Tk()
program = App(root)

Теперь мы можем ссылаться на параметры с действительным действительным именем

tk.Tk() передается в качестве параметра для App () 's __init__() method: Таким образом, мы добавляем его в графике.

IMAGE003

Когда создается экземпляр App(), self ссылается наэкземпляр program и master ссылаются на root, то есть tk.Tk().

Следующая строка - super().__init__(master), которая переопределяет метод tk.Frame __init__(), вставляя параметр master с помощьюmaster значение приложения.Поэтому мы можем преобразовать это как tk.Frame.__init__(tk.Tk())

IMAGE004

Затем создается виджет tk.Label() с Label(master,text="This is a label sample."), в котором главный параметр App () устанавливается какмастер виджетов Label ().

IMAGE005

После этого виджет tk.Label() упаковывается (что несущественно для вопроса).

Концепция и вопрос

IMAGE005

Теперь, по мнению некоторых программистов, App(tk.Frame) и super().__init__(master) строки предназначены для создания виджета Frame, в котором будут находиться все элементы, указанные в App() .

Но дело в том, что ...

Зачем нам настраивать эту среду, если, как вы видите на следующем рисунке, мастер tk.Label() является tk.Tk() НЕ tk.Frame? Есть ли у меня какое-то недопонимание концепции, и эти два утверждения действительно имеют значение в коде?

Заранее спасибо.

1 Ответ

0 голосов
/ 01 марта 2019

И наша цель - понять, какова важность / роль в переопределении родительского метода init () класса с указанным «master», если все наши внутренние виджеты не будут точно иметь класс класса родителя каких мастер, вместо объекта tkinter Tk ().

Если внутренние виджеты имеют , а не , имеют self или одного из его потомков в качестве мастера, вы не должны наследоватьот tk.Frame.Нет просто никакой причины наследовать от любого из классов tk, если все объекты в этом классе размещены в корневом окне.

Другими словами, вы должны либо

  • наследуется от tk.Frame и делает все виджеты, созданные в __init__, дочерними по отношению к self или одному из его потомков, или
  • do не наследуется от tk.Frame и размещает все виджеты там, где вы хотите.

Смешивать эти две техники вместе не имеет смысла, и делать это не следует.

...