Я Брайан!У меня есть некоторый опыт работы с 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
? Есть ли у меня какое-то недопонимание концепции, и эти два утверждения действительно имеют значение в коде?
Заранее спасибо.