Вытаскивай создание базы SQLite наружу из класса окна.
Feelgood
conn = sqlite3.connect('finance.db')
Вот это должно происходить в классе DB, который ты должен сделать.
Feelgood
Потом ты снаружи создаёшь базу и подаёшь её (уже готовую) в конструктор окна.
app = Main(root, DB('finance.db'))
А окно внутри себя её просто сохраняет.
Feelgood
class Main(tk.Frame):
def __init__(self, root, db):
super().__init__(root)
self.db = db
self.init_main()
Потом ты просто у этой переменной self.db вызываешь методы cursor(), execute(), commit(). При этом это не прямые методы базы (базы ведь бывают разные и эти методы могут по-разному называться в разных базах), а это просто методы класса DB, который при их вызове вызывает прямые методы базы, которая внутри него открыта.
То есть для того же метода execute() можно сделать свой язык запросов, более удобный и
универсальный, чем в SQLite или любой другой базе, которая может быть подана таким образом.
Потом при создании окна Child, во-первых, ты должен само окно Child прикрепить к Main (если оно дочернее, оно должно быть прикреклено к родительскому), а во-вторых, точно так же подать в дочернее окно базу из окна Main. Мы не используем базу из родительского окна напрямую через него, потому что не факт, что такая конструкция будет всегда сохраняться (сегодня это дочернее окно прикреплено к этому родительскому, завтра - к другому; сегодня в родительском окне база прикреплена, завтра - её убрали оттуда), из дочернего окна внутрь родительского мы не лазим (прямо такое правило себе заведи). Когда создаётся дочернее окно, оно не должно знать внутреннее устройство своего родительского окна, поэтому к базе внутри родителя мы не обращаемся, а передаём эту базу в конструктор дочернего окна, как будто это просто созданная где-то снаружи база, считаем её вообще отдельной базой. То есть суть в том, что окна не знают, где и как создавалась база, которая подаётся снаружи; они только знают, как с этой поданной снаружи базой обращаться через её методы. При этом в данном случае эти базы совпадают, а вообще всё делается так (готовится заранее), будто эти базы разные. Меньше привязок должно быть к условиям каким-то (где какое окно, какое окно под каким; где базы одинаковые, а где разные, - это всё ненужные ограничения, которые сковывают программу и делают изменения невозможными).