boa tarde estou enfrentando erro neste projeto MVC que fiz ide alega que ouve estouro de pilha só que não estou achando o erro e se tiver algum outro erro no código vocês poderem informar agradeceria  meus códigos  do meu projeto: 
 
	código main:  
 
	
		import tkinter
	
	
		from controller import CadastroController, LoginController, RegistroController, VendasController
	
	
		from model import LoginModel
	
	 
	
		def main():
	
	
		    login_model = LoginModel()
	
	
		    login_controller = LoginController(login_model)
	
	 
	
		    cadastro_controller = CadastroController()
	
	
		    vendas_controller = VendasController()
	
	
		    registro_controller = RegistroController()
	
	 
	
		    tkinter.mainloop()
	
	 
	
		if __name__ == "__main__":
	
	
		    main()
	
	
		 
	
	
		codigo view :  
		
			
				import tkinter as tk
			
			
				from tkinter import messagebox
			
			
				import tkinter as tk
			
			
				class TelaLoginView(tk.Tk):
			
			
				    def __init__(self, controller):
			
			
				        super().__init__()  # Chamar o construtor da classe pai
			
			
				        self.controller = controller
			
			
				        self.title("Tela de Login")
			
			
				        email_label = tk.Label(self, text="Seu email:")
			
			
				        email_label.grid(row=0, column=0, padx=5, pady=5)
			
			
				        senha_label = tk.Label(self, text="Sua senha:")
			
			
				        senha_label.grid(row=1, column=0, padx=5, pady=5)
			
			
				        self.email_entry = tk.Entry(self)
			
			
				        self.email_entry.grid(row=0, column=1, padx=5, pady=5)
			
			
				        self.senha_entry = tk.Entry(self, show="*")
			
			
				        self.senha_entry.grid(row=1, column=1, padx=5, pady=5)
			
			
				        manter_logado_var = tk.IntVar()
			
			
				        manter_logado_checkbox = tk.Checkbutton(self, text="Manter-me logado", variable=manter_logado_var)
			
			
				        manter_logado_checkbox.grid(row=2, column=0, columnspan=2, padx=5, pady=5)
			
			
				        entrar_btn = tk.Button(self, text="Entrar", command=self.realizar_login)
			
			
				        entrar_btn.grid(row=3, column=0, columnspan=2, padx=5, pady=5)
			
			
				        cadastrar_link = tk.Button(self, text="Cadastrar", command=self.abrir_cadastro)
			
			
				        cadastrar_link.grid(row=4, column=0, columnspan=2, padx=5, pady=5)
			
			
				        self.venda_button = tk.Button(self, text="Vendas", command=self.abrir_vendas)
			
			
				        self.venda_button.grid(row=20, column=0, columnspan=2, pady=12)
			
			
				        self.controller = controller
			
			
				class TelaCadastroView(tk.Toplevel):
			
			
				    def __init__(self, controller):
			
			
				        self.controller = controller
			
			
				        self.title("Cadastro de Automóvel")
			
			
				        nome_cliente_label = tk.Label(self, text="Nome Cliente:")
			
			
				        nome_cliente_label.grid(row=0, column=0, padx=5, pady=5)
			
			
				        modelo_label = tk.Label(self, text="Modelo:")
			
			
				        modelo_label.grid(row=1, column=0, padx=5, pady=5)
			
			
				        km_label = tk.Label(self, text="KM:")
			
			
				        km_label.grid(row=2, column=0, padx=5, pady=5)
			
			
				        num_chassi_label = tk.Label(self, text="Nº Chassi:")
			
			
				        num_chassi_label.grid(row=3, column=0, padx=5, pady=5)
			
			
				        carroceria_label = tk.Label(self, text="Carroceria:")
			
			
				        carroceria_label.grid(row=4, column=0, padx=5, pady=5)
			
			
				        marca_label = tk.Label(self, text="Marca:")
			
			
				        marca_label.grid(row=5, column=0, padx=5, pady=5)
			
			
				        ano_label = tk.Label(self, text="Ano:")
			
			
				        ano_label.grid(row=6, column=0, padx=5, pady=5)
			
			
				        valor_fipe_label = tk.Label(self, text="Valor FIPE:")
			
			
				        valor_fipe_label.grid(row=7, column=0, padx=5, pady=5)
			
			
				        cor_label = tk.Label(self, text="Cor:")
			
			
				        cor_label.grid(row=8, column=0, padx=5, pady=5)
			
			
				        combustivel_label = tk.Label(self, text="Combustível:")
			
			
				        combustivel_label.grid(row=9, column=0, padx=5, pady=5)
			
			
				        cambio_label = tk.Label(self, text="Câmbio:")
			
			
				        cambio_label.grid(row=10, column=0, padx=5, pady=5)
			
			
				        self.nome_cliente_entry = tk.Entry(self)
			
			
				        self.nome_cliente_entry.grid(row=0, column=1, padx=5, pady=5)
			
			
				        self.modelo_entry = tk.Entry(self)
			
			
				        self.modelo_entry.grid(row=1, column=1, padx=5, pady=5)
			
			
				        self.km_entry = tk.Entry(self)
			
			
				        self.km_entry.grid(row=2, column=1, padx=5, pady=5)
			
			
				        self.num_chassi_entry = tk.Entry(self)
			
			
				        self.num_chassi_entry.grid(row=3, column=1, padx=5, pady=5)
			
			
				        self.carroceria_entry = tk.Entry(self)
			
			
				        self.carroceria_entry.grid(row=4, column=1, padx=5, pady=5)
			
			
				        self.marca_entry = tk.Entry(self)
			
			
				        self.marca_entry.grid(row=5, column=1, padx=5, pady=5)
			
			
				        self.ano_entry = tk.Entry(self)
			
			
				        self.ano_entry.grid(row=6, column=1, padx=5, pady=5)
			
			
				        self.valor_fipe_entry = tk.Entry(self)
			
			
				        self.valor_fipe_entry.grid(row=7, column=1, padx=5, pady=5)
			
			
				        self.cor_entry = tk.Entry(self)
			
			
				        self.cor_entry.grid(row=8, column=1, padx=5, pady=5)
			
			
				        self.combustivel_entry = tk.Entry(self)
			
			
				        self.combustivel_entry.grid(row=9, column=1, padx=5, pady=5)
			
			
				        self.cambio_entry = tk.Entry(self)
			
			
				        self.cambio_entry.grid(row=10, column=1, padx=5, pady=5)
			
			
				        self.save_button = tk.Button(self, text="Salvar", command=self.save_car)
			
			
				        self.save_button.grid(row=22, column=0, columnspan=2, pady=10)
			
			
				        self.controller = controller
			
			 
			
				class TelaVendasView(tk.Toplevel):
			
			
				    def __init__(self, controller):
			
			
				        self.title("Tela de Vendas")
			
			
				        self.controller = controller
			
			
				        cliente_label = tk.Label(self, text="Cliente:")
			
			
				        cliente_label.grid(row=0, column=0, padx=5, pady=5, sticky="e")
			
			
				        venda_label = tk.Label(self, text="Venda:")
			
			
				        venda_label.grid(row=1, column=0, padx=5, pady=5, sticky="e")
			
			
				        documento_label = tk.Label(self, text="Documento:")
			
			
				        documento_label.grid(row=2, column=0, padx=5, pady=5, sticky="e")
			
			
				        data_venda_label = tk.Label(self, text="Data da Venda:")
			
			
				        data_venda_label.grid(row=3, column=0, padx=5, pady=5, sticky="e")
			
			
				        data_fim_mov_label = tk.Label(self, text="Data Fim Movi:")
			
			
				        data_fim_mov_label.grid(row=4, column=0, padx=5, pady=5, sticky="e")
			
			
				        valor_venda_label = tk.Label(self, text="Valor da Venda:")
			
			
				        valor_venda_label.grid(row=5, column=0, padx=5, pady=5, sticky="e")
			
			
				        obs_label = tk.Label(self, text="Observações:")
			
			
				        obs_label.grid(row=6, column=0, padx=5, pady=5, sticky="e")
			
			
				        self.cliente_entry = tk.Entry(self)
			
			
				        self.cliente_entry.grid(row=0, column=1, padx=5, pady=5)
			
			
				        self.venda_entry = tk.Entry(self)
			
			
				        self.venda_entry.grid(row=1, column=1, padx=5, pady=5)
			
			
				        self.documento_entry = tk.Entry(self)
			
			
				        self.documento_entry.grid(row=2, column=1, padx=5, pady=5)
			
			
				        self.data_venda_entry = tk.Entry(self)
			
			
				        self.data_venda_entry.grid(row=3, column=1, padx=5, pady=5)
			
			
				        self.data_fim_mov_entry = tk.Entry(self)
			
			
				        self.data_fim_mov_entry.grid(row=4, column=1, padx=5, pady=5)
			
			
				        self.valor_venda_entry = tk.Entry(self)
			
			
				        self.valor_venda_entry.grid(row=5, column=1, padx=5, pady=5)
			
			
				        self.obs_entry = tk.Entry(self)
			
			
				        self.obs_entry.grid(row=6, column=1, padx=5, pady=5)
			
			
				        self.venda_button = tk.Button(self, text="Finalizar", command=self.controller.save_venda)
			
			
				        self.venda_button.grid(row=22, column=0, columnspan=2, pady=10)
			
			
				        self.registro_button = tk.Button(self, text="Abrir Registro", command=self.controller.abrir_cadastro)
			
			
				        self.registro_button.grid(row=7, column=0, columnspan=2, pady=10)
			
			 
			
				class TelaRegistroView(tk.Toplevel):
			
			
				    def __init__(self, controller):
			
			
				        self.title("Tela de Registro")
			
			
				        self.controller = controller
			
			
				        periodolabel = tk.Label(self, text="Período:")
			
			
				        periodolabel.grid(row=0, column=0, padx=5, pady=5, sticky="e")
			
			
				        tipomovimentacaolabel = tk.Label(self, text="Tipo de Movimentação:")
			
			
				        tipomovimentacaolabel.grid(row=1, column=0, padx=5, pady=5, sticky="e")
			
			
				        datainiciallabel = tk.Label(self, text="Data Inicial:")
			
			
				        datainiciallabel.grid(row=2, column=0, padx=5, pady=5, sticky="e")
			
			
				        datafinallabel = tk.Label(self, text="Data Final:")
			
			
				        datafinallabel.grid(row=3, column=0, padx=5, pady=5, sticky="e")
			
			
				        self.periodoentry = tk.Entry(self)
			
			
				        self.periodoentry.grid(row=0, column=1, padx=5, pady=5)
			
			
				        self.tipomovimentacao_entry = tk.Entry(self)
			
			
				        self.tipomovimentacao_entry.grid(row=1, column=1, padx=5, pady=5)
			
			
				        self.datainicial_entry = tk.Entry(self)
			
			
				        self.datainicial_entry.grid(row=2, column=1, padx=5, pady=5)
			
			
				        self.datafinal_entry = tk.Entry(self)
			
			
				        self.datafinal_entry.grid(row=3, column=1, padx=5, pady=5)
			
			
				        self.consultar_button = tk.Button(self, text="Consultar", command=lambda: self.controller.consultar_registros(self.periodoentry.get(), self.tipomovimentacao_entry.get()))
			
			
				        self.consultar_button.grid(row=22, column=0, columnspan=2, pady=10)
			
			
				        self.gerar_relatorio_button = tk.Button(self, text="Gerar Relatório", command=lambda: self.controller.gerar_relatorio(self.periodoentry.get(), self.tipomovimentacao_entry.get()))
			
			
				        self.gerar_relatorio_button.grid(row=7, column=0, columnspan=2, pady=10)
			
			
				        imprimirbutton = tk.Button(self, text="Imprimir", command=self.controller.imprimir_relatorio)
			
			
				        imprimirbutton.grid(row=4, column=2, padx=5, pady=5) 
			
			
				          codigo controller:  
				
					
						from tkinter import messagebox
					
					
						from view import TelaLoginView, TelaCadastroView, TelaVendasView, TelaRegistroView
					
					
						from model import LoginModel, CadastroModel, VendasModel, RegistroModel
					
					 
					
						class LoginController:
					
					
						    def __init__(self, model):
					
					
						        self.model = model
					
					
						        self.view = TelaLoginView(self)
					
					 
					
						class CadastroController:
					
					
						    def __init__(self, model):
					
					
						        self.model = model
					
					
						        self.view = TelaCadastroView(self)
					
					 
					
						class VendasController:
					
					
						    def __init__(self, model):
					
					
						        self.model = model
					
					
						        self.view = TelaVendasView(self)
					
					 
					
						class RegistroController:
					
					
						    def __init__(self, model):
					
					
						        self.model = model
					
					
						        self.view = TelaRegistroView(self)
					
					 
					
						    def consultar_registros(self, periodo, tipo_movimentacao, data_inicial, data_final):
					
					
						        registros = self.model.consultar_registros(periodo, tipo_movimentacao, data_inicial, data_final)
					
					
						        self.view.mostrar_registros(registros)
					
					 
					
						    def gerar_relatorio(self, periodo, tipo_movimentacao, data_inicial, data_final):
					
					
						        relatorio = self.model.gerar_relatorio(periodo, tipo_movimentacao, data_inicial, data_final)
					
					
						        self.view.mostrar_relatorio(relatorio)
					
					 
					
						    def imprimir_relatorio(self, relatorio):
					
					
						        self.model.imprimir_relatorio(relatorio)
					
					
						        messagebox.showinfo("Impressão", "O relatório foi enviado para a impressora.") 
					
					
						 
					
					
						           codigo Model:  
						
							
								from datetime import datetime
							
							
								from tkinter import messagebox
							
							 
							
								class LoginModel:
							
							
								    def validate_login(self, username, password):
							
							
								       
							
							
								        if username != "" and password != "":
							
							
								            return True
							
							
								        else:
							
							
								            return False
							
							 
							
								class CadastroModel:
							
							
								    def save_car(self, car_data):
							
							
								         car_data = {
							
							
								            "nome_cliente": self.nome_cliente_entry.get(),
							
							
								            "modelo": self.modelo_entry.get(),
							
							
								            "km": self.km_entry.get(),
							
							
								            "num_chassi": self.num_chassi_entry.get(),
							
							
								            "carroceria": self.carroceria_entry.get(),
							
							
								            "marca": self.marca_entry.get(),
							
							
								            "ano": self.ano_entry.get(),
							
							
								            "valor_fipe": self.valor_fipe_entry.get(),
							
							
								            "cor": self.cor_entry.get(),
							
							
								            "combustivel": self.combustivel_entry.get(),
							
							
								            "cambio": self.cambio_entry.get(),
							
							
								        }
							
							 
							
								         self.controller.save_car(car_data)
							
							
								         messagebox.showinfo("Cadastro de Automóvel", "Automóvel cadastrado com sucesso!")
							
							
								    
							
							
								class VendasModel:
							
							
								    def save_venda(self, venda_data):
							
							
								        venda_data = {
							
							
								            "cliente": self.view.cliente_entry.get(),
							
							
								            "venda": self.view.venda_entry.get(),
							
							
								            "documento": self.view.documento_entry.get(),
							
							
								            "data_venda": self.view.data_venda_entry.get(),
							
							
								            "data_fim_mov": self.view.data_fim_mov_entry.get(),
							
							
								            "valor_venda": self.view.valor_venda_entry.get(),
							
							
								            "obs": self.view.obs_entry.get()
							
							
								        }
							
							
								        self.model.save_venda(venda_data)
							
							
								        messagebox.showinfo("Vendas", "Venda salva com sucesso!")
							
							 
							
								class RegistroModel:
							
							 
							
								    def consultar_registros(self, periodo, tipo_movimentacao, data_inicial, data_final):
							
							
								        registros = [
							
							
								            {"id": 1, "data": datetime.now(), "descricao": "Registro 1"},
							
							
								            {"id": 2, "data": datetime.now(), "descricao": "Registro 2"},
							
							
								            {"id": 3, "data": datetime.now(), "descricao": "Registro 3"},
							
							
								        ]
							
							
								        return registros
							
							 
							
								    def gerar_relatorio(self, periodo, tipo_movimentacao, data_inicial, data_final):
							
							
								         periodo = self.view.periodoentry.get()
							
							
								         tipo_movimentacao = self.view.tipomovimentacao_entry.get()
							
							
								         data_inicial = self.view.datainicial_entry.get()
							
							
								         data_final = self.view.datafinal_entry.get()
							
							
								         relatorio = self.model.gerar_relatorio(periodo, tipo_movimentacao, data_inicial, data_final)
							
							
								         self.view.mostrar_relatorio(relatorio)
							
							 
							
								    def imprimir_relatorio(self, relatorio):
							
							
								        periodo = self.view.periodoentry.get()
							
							
								        tipo_movimentacao = self.view.tipomovimentacao_entry.get()
							
							
								        data_inicial = self.view.datainicial_entry.get()
							
							
								        data_final = self.view.datafinal_entry.get()
							
							
								        relatorio = self.model.gerar_relatorio(periodo, tipo_movimentacao, data_inicial, data_final)
							
							
								        self.model.imprimir_relatorio(relatorio)
							
							
								        messagebox.showinfo("Impressão", "O relatório foi enviado para a impressora.")