1. Оформи код. Кнопка </> в помощь. Сейчас нечитаемо.
2. Включить голову и разобраться, как же работает графический интерфейс (потому что принципы одинаковые в любом языке практически). Ну и немножко подучить Питон на более простых примерах.
root_changes_2.mainloop()
запускает основной рабочий цикл. В нём программа получает сообщения от ОС о действиях пользователя и реагирует на них. Цикл прерывается, когда закрывается основное окно (ты хранишь ссылку на него в root_changes_2).
Как следствие, программа будет стоять на этой строке, пока ты не закроешь окно, и ТОЛЬКО ПОТОМ перейдёт к объявлению класса Main_window.
Это объявление, разумеется, ничего не даёт - ведь ты просто объявил класс, но не создал его экземпляр. А после объявления класса у тебя ничего нет, поэтому скрипт завершает работу.
Я ФЗ что такое ttkbootstrap, поэтому покажу простой пример на голом tkinter.
import tkinter as tk
import tkinter.messagebox as tkmb
class MainWindow(tk.Tk):
"""Главное окно программы наследуется от Tk.
Вспомогательные окна - от TopLevel.
Составные элементы управления - от Frame."""
def __init__(self):
"""Метод __init__() автоматически вызывается при создании нового экземпляра класса."""
super().__init__() # обязательно вызываем конструктор родительского класса!
# при закрытии нашего окна вызовется метод __done()
# если эта функциональность не нужна, можно убрать эту строку
self.protocol('WM_DELETE_WINDOW', self.__done)
# пример создания элементов управления
# имена, начинающиеся с __, не видны снаружи класса
# мы присваиваем не просто переменным, а полям объекта. Эти поля будут видны в других методах.
self.__entry = tk.Entry(self) # поле ввода будет вложено непосредственно в наше окно
self.__entry.pack(side=tk.TOP, fill=tk.X, expand=True)
self.__btn = tk.Button(self, text='Нажми меня', command=self.__btn_pressed) # кнопка и реакция на неё
self.__btn.pack(side=tk.TOP)
def __done(self):
"""Мы прописали вызов этого метода при закрытии окна.
Тут мы можем корректно завершить работу нашей программы, а потом подтвердить закрытие."""
self.destroy() # подтверждаем закрытие. Если этот вызов не сделать, окно не закроется. Иногда это нужно.
def __btn_pressed(self):
"""Реакция на кнопку."""
text = self.__entry.get() # мы можем обращаться к полям объекта
tkmb.showinfo(
title='Вы ввели',
message=text,
parent=self
)
if __name__ == '__main__':
# это условие выполнится, только если скрипт запущен непосредственно
# оно не выполнится, если скрипт импортируется другим скриптом
# поэтому в такое условие обычно заворачивают "тело" скрипта
wnd = MainWindow() # создаём окно
wnd.mainloop() # главный рабочий цикл
# сюда управление будет передано после закрытия окна
print('Окно закрыто, пока!')