Вы правы, что вам нужно назвать класс tkinter.Frame
вместо просто Frame
.
И вы также правы, что ничего не решите.
Потому чтокорень проблемы в том, что вам нужно вызывать метод на Frame
экземпляре , а не на Frame
классе .
К счастью, у вас есть готовыйссылка на соответствующий Frame
экземпляр, лежащий вокруг, из этой строки:
top_Frame = tkinter.Frame(welk_window, width = "1", height = "1")
Итак, вы можете просто использовать его:
self.Button_quit = tkinter.Button(top_Frame, text = "Quit", fg ="red",
command=top_Frame.quit)
Однако, стоит подуматьнемного редизайна.
Обычно, когда вы создаете классы для tkinter, вы хотите, чтобы ваши объекты были либо непосредственно виджетом, либо контроллером для виджета.Ваш Main_Frame
объект просто создает виджет кадра во время инициализации, а затем забывает его, так что на самом деле это не так.
Чтобы сделать Main_Frame
рамкой, просто наследуйте от Frame
и используйте self
везде, где вы бы использовали top_Frame
:
class Main_Frame(tkinter.Frame):
def __init__(self, welk_window):
super().__init__(welk_window, width = "1", height = "1")
self.pack()
self.Button_start = tkinter.Button(self, text = "Start", fg ="green", command=self.startMessage)
self.Button_start.pack(side=tkinter.LEFT)
self.Button_quit = tkinter.Button(self, text = "Quit", fg ="red", command=self.quit)
self.Button_quit.pack(side=tkinter.LEFT)
def startMessage(self):
print("Start")
Чтобы сделать его контроллером кадров, просто сохраните top_Frame
в качестве атрибута, так же, как вы делаете с Button_start
:
class Main_Frame:
def __init__(self, welk_window):
self.top_Frame = tkinter.Frame(welk_window, width = "1", height = "1")
self.top_Frame.pack()
self.Button_start = tkinter.Button(top_Frame, text = "Start", fg ="green", command=self.startMessage)
self.Button_start.pack(side=tkinter.LEFT)
self.Button_quit = tkinter.Button(top_Frame, text = "Quit", fg ="red", command=self.top_Frame.quit)
self.Button_quit.pack(side=tkinter.LEFT)
def startMessage(self):
print("Start")