Python stopped working, but I think it’s something in the code

Asked

Viewed 369 times

-1

I’ve asked a question before about this project... But anyway, I worked on it and added the Menu class, which is a daughter class of the Windows class. Follow the source of the main.py code file.:

#!/usr/bin/python3
from janela import *

menu=Menu(["Roboto",10],"LavenderBlush",[1,40],('250x170'),"MENU")

Now the window.py file:

#!/usr/bin/python3
from tkinter import *
from criar_widgets import *

class Janelas:
    def __init__(self,fonte,fundo,titulo):
        #Esta é a variável da janela mãe
        self.root = Tk()

        #Esta é a cor de fundo da janela
        self.root["bg"]=fundo

        #Este é o título
        self.titulo=Criar_Label_Titulo(self.root,titulo,fonte,fundo)

        return

class Menu(Janelas):
    def __init__(self,fonte,fundo,xy,tela,titulo):
        super().__init__(fonte,fundo,titulo)

        abaixar,alinhar=30,70

        self.bt_login=Criar_Button(self.root,"LOGIN",fonte,fundo,lambda:Autenticar(self.root, fonte, fundo, xy,"250x170","LOGIN",False))

        self.bt_cadastrar=Criar_Button(self.root,"CADASTRO",fonte,fundo,lambda:Cadastro(self.root,fonte, fundo,xy,"400x200","CADASTRO",False))

class Autenticar(Janelas):
    def __init__(self,janela_antiga,fonte,fundo,xy,tela,titulo):

        janela_antiga.destroy()

        super().__init__(fonte,fundo,titulo)

        abaixar,alinhar=30,70

        self.user=Criar_Label(self.root,"USUÁRIO",xy[0],xy[1],fonte,fundo)
        self.entrar_user=Criar_Entry(self.root,xy[0]+alinhar,xy[1],fonte,False)

        #Label e entrada da senha respectivamente
        self.senha=Criar_Label(self.root,"SENHA",xy[0],xy[1]+abaixar,fonte,fundo)
        self.entrar_senha=Criar_Entry(self.root,xy[0]+alinhar,xy[1]+abaixar,fonte,True)

        #Botão que fará a mudança para uma nova tela
        self.botao=Criar_Button(self.root,"INSERIR NOME",fonte,fundo,lambda:Autenticar.login(self.root, self.entrar_user.entry.get(), self.entrar_senha.entry.get()))

        #Este é o tamanho da janela
        self.root.geometry(tela)
        self.root.mainloop()

    def login(root,usuario,senha):
        if usuario == "" and senha == "":
            #print("Tudo certo, podemos fazer a próxima janela")
            nova_janela=Cadastrar(root,["Roboto",10],"LavenderBlush",[1,40],('400x200'),"AUTENTICAR",False)

class Cadastrar(Janelas):
    def __init__(self,janela_antiga,fonte,fundo,xy,tela,titulo):
        #Adeus janela  antiga
        janela_antiga.destroy()

        #olá janela nova
        super().__init__(fonte,fundo,titulo)

        #As variáveis a seguir serão usadas para alinhar e abaixar cada widget
        abaixar,alinhar=30,150

        #Label e entrada do nome
        self.nome=Criar_Label(self.root,"NOME",xy[0],xy[1],fonte,fundo)
        self.entrar_nome=Criar_Entry(self.root,xy[0]+alinhar,xy[1],fonte,False)

        self.genero=Criar_Label(self.root,"GÊNERO",xy[0],xy[1]+abaixar,fonte,fundo)
        self.entrar_genero=Criar_Entry(self.root,xy[0]+alinhar,xy[1]+abaixar,fonte,False)

        #Abaixar widgets mais 30 pixels
        abaixar+=30

        self.data_nascimento=Criar_Label(self.root,"DATA NASCIMENTO",xy[0],xy[1]+abaixar,fonte,fundo)
        self.entrar_data_nascimento=Criar_Entry(self.root,xy[0]+alinhar,xy[1]+abaixar,fonte,False)

        #Abaixar widgets mais 30 pixels
        abaixar+=30

        self.idade=Criar_Label(self.root,"IDADE",xy[0],xy[1]+abaixar,fonte,fundo)
        self.entrar_idade=Criar_Entry(self.root,xy[0]+alinhar,xy[1]+abaixar,fonte,False)

        self.botao_cadastrar=Criar_Button(self.root,"CADASTRAR",fonte,fundo,Cadastrar.salvar)

        self.root.geometry(tela)
        self.root.mainloop()

    def salvar():
        print("O botao funciona!!!")

And finally the file creat_widgets.py (this one hasn’t touched lately, I think the error doesn’t come from here):

#!/usr/bin/python3
from tkinter import *

class Criar_Label:
    def __init__(self,root,texto,abcissa,ordenada,fonte,fundo):
         self.label=Label(root)
         self.label["text"]=texto
         self.label["font"]=fonte
         self.label["bg"]=fundo
         self.label.place(x=abcissa,y=ordenada)

#Será que deveríamos fazer polimorfismo aqui e fazer da classe Criar_Label a classe mãe?
class Criar_Label_Titulo:
    def __init__(self,root2,texto,fonte,fundo):
         self.titulo=Label(root2)
         self.titulo["text"]=texto
         self.titulo["font"]=fonte
         self.titulo["bg"]=fundo
         self.titulo.pack()

class Criar_Entry:
    def __init__(self,root2,abcissa,ordenada,fonte,segredo):
         self.entry=Entry(root2,font=fonte)
         self.entry.place(x=abcissa,y=ordenada)
         if segredo:
             self.entry["show"]="*"

class Criar_Button:
    def __init__(self,root2,texto,fonte,fundo,comando):
         self.button=Button(root2)
         self.button["text"]=texto
         self.button["font"]=fonte
         self.button["bg"]=fundo
         self.button["command"]=comando

         self.button.pack(side=BOTTOM)

It does not return ero and nothing, just does not run the script, since it worked perfectly before n can be nothing in the system (until I did not touch the system in the meantime).

The operating system used by me is "Xubuntu Linux version 5.0.0-36-Generic" Print from my terminal running the file and showing that it is there:

Print do meu terminal executando o arquivo e mostrando que ele está lá

I really believe it’s not about the operating system or bad installation, just a change in code that must have been malicious and that I can’t find

1 answer

2


Your code is correct, and it’s not really generating an exception, it turns out that at no point did you call the method mainloop, with this you create the entire interface and end up not displaying it, and the program ends normally, after all there is no more code to run.

You can opt for some modifications, one of them would be you use the root property that Menu inherits from Janelas and call the method mainloop:

#!/usr/bin/python3
from janela import *

menu=Menu(["Roboto",10],"LavenderBlush",[1,40],('250x170'),"MENU")
menu.root.mainloop()

It is also possible to create a method that accesses this property and displays the dialog, creating in the Windows class, all that inherit would already have access, for example:

def show(self):
    self.root.mainloop()

If you notice, in the classes Cadastrar and Autenticar, you called this method right at __init__, that is, you can do the same in class Menu:

self.root.mainloop()
  • It worked!!!! Thank you

Browser other questions tagged

You are not signed in. Login or sign up in order to post.