Ваша проблема связана с этой строкой:
self = tk.Frame(parent)
self
используется для ссылки на класс, и именно так мы можем получить доступ к методам и атрибутам класса из других методов и вне класса , Однако вы на самом деле переопределяете, что значит быть фреймом, а у фреймов нет атрибута класса Main_Title
.
. Чтобы исправить это, вы также хотите определить фрейм как атрибут класса. Нечто подобное будет работать нормально:
self.frame = tk.Frame(parent)
Все, что говорит, я бы изменил несколько вещей.
Я бы написал 2-й класс для наследования от фрейма. Я считаю, что это немного чище и проще в обслуживании.
Вы должны попытаться следовать стандартному соглашению об именах. Ваше имя не соответствует. Вам нужно некоторое время, чтобы прочитать PEP8 , чтобы ваш код было легче читать.
Я предпочитаю использовать super().__init__()
вместо tk.Tk.__init__()
, так как он работает для большинство ситуаций, а также текущий стандарт для Python 3.
Он предпочитает применять диспетчер геометрии вне класса, когда ваш класс является контейнером, подобным фрейму. Таким образом, если вам нужно использовать этот же фрейм в другом месте, вы можете использовать любой менеджер геометрии, не сталкиваясь с конфликтами, если вы используете grid()
или pack()
в различных областях вашего кода.
Исправлен и очищен код для более точного соответствия стандартам PEP8:
import tkinter as tk
class Window(tk.Tk):
def __init__(self):
super().__init__()
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
self.label1 = tk.Label(container, text="label")
self.label1.pack()
tk.Button(self, text="Continue", command=lambda: books_display(sub_frame.main_title)).pack()
def print_label(self):
print(self.label1['text'])
class SubFrameNewScripts(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.main_title = tk.Label(self, text="New Scripts")
self.main_title.grid(row=0, column=0)
self.book_display_frame = tk.Frame(self)
self.book_display_frame.grid(row=1, column=0)
def books_display(widget):
print(widget['text'])
if __name__ == '__main__':
app = Window()
sub_frame = SubFrameNewScripts(app)
sub_frame.pack()
app.mainloop()
Результаты:
