name is not defined - name / variable not defined, tkinter and slite3 help

0

I'm starting to study sqlite3 on the go, and this is difficult, but I've already got some things, the problem is that when compiling the program the following error appears:

"name 'adic' is not defined".

Follow the code:

from tkinter import*
import sqlite3

class Principal:
    def __init__(self):
        janela_principal = Tk()
        janela_principal.geometry("400x400+50+50")
        #janela_principal.overrideredirect(True)

        lb0 = Label(janela_principal)
        lb0.grid(row=0, column=0, padx=13)


        lb1 = Label(janela_principal, text="Digite um número:")
        lb1.grid(row=1, column=1, sticky=E)
        digite_numero = Entry(janela_principal, width=35)
        digite_numero.grid(row=1, column=2, sticky=W)
        separador = Frame(janela_principal, height=2, bd=3, relief=SUNKEN, width=340)
        separador.grid(row=2, column=1, columnspan=2)

        lb2 = Label(janela_principal, text="Assunto:")
        lb2.grid(row=3, column=1, sticky=E)
        digite_assunto = Entry(janela_principal, width=35)
        digite_assunto.grid(row=3, column=2, sticky=W)

        separador = Frame(janela_principal, height=2, bd=3, relief=SUNKEN, width=340)
        separador.grid(row=4, column=1, columnspan=2)

        add = Button(janela_principal, text="ADICIONAR NOME", relief=SOLID, border=1, foreground="BLUE", command=adic)
        add.grid(row=5, column=2, columnspan=2, sticky=W)
        apagar = Button(janela_principal, text="APAGAR NOME", relief=SOLID, border=1, foreground="RED", command=apag)
        apagar.grid(row=5, column=2, sticky=E)


        lb3 = Label(janela_principal)
        lb3.grid(row=6, column=0)


        rolagem = Scrollbar(janela_principal)
        rolagem.grid(row=7, column=2, sticky=N+S+E)

        caixa_exibição = Listbox(janela_principal, relief=SOLID, border=1, width=45, height=15, font=("Gentium Basic", 11))
        caixa_exibição.grid(row=7, column=1, columnspan=2, sticky=W)


        #for i in range(100):
        #    caixa_exibição.insert(END, i)

        # attach listbox to scrollbar
        caixa_exibição.config(yscrollcommand=rolagem.set)
        rolagem.config(command=caixa_exibição.yview)



        #Banco
        conectar = sqlite3.connect("numeros.db")
        cursor = conectar.cursor()
        cursor.execute("CREATE TABLE IF NOT EXISTS nomes(numeros TEXT, assunto TEXT)")
        conectar.commit()
        lista = cursor.execute("SELECT * FROM nomes")
        for i in lista:
            caixa_exibição.insert(END, i)

    def adic():
        numerosx = digite_numero.get()
        assuntox = digite_assunto.get()
        cursor.execute("INSERT INTO nomes values(?, ?)", (numerosx, assuntox))
        conectar.commit()
        caixa_exibição.insert(END, numerosx)
        caixa_exibição.insert(END, assuntox)

    def apag():
        numerosy = str(caixa_exibição.get(ACTIVE))[3:-3]
        assuntoy = str(caixa_exibição.get(ACTIVE))[3:-3]

        cursor.execute("DELETE FROM nomes WHERE name=?, ?", (numerosy, assuntoy))
        conectar.commit()
        caixa_exibição.delete(ANCHOR)





        janela_principal.mainloop()

Principal()
    
asked by anonymous 09.08.2018 / 05:12

2 answers

-1

For professional advice, always indicate the methods before the rest of the program ( although not necessary, do as you want ).

Because you are using classes, you need to use self. to be able to access the variables within the class, so "add" appeared as "undefined" because it was out of scope.

Here is the code showing some applications in this sense, it is not necessarily mandatory to use everything as I used it:

from tkinter import*
import sqlite3

class Principal:
    def adic(self): #Métodos antes, com o paramentro self para receber variáveis do __init__
        numerosx = self.digite_numero.get() #Por ser uma variável utilizada apenas dentro dessa função, não existe a necessidade do self.
        assuntox = self.digite_assunto.get()
        self.cursor.execute("INSERT INTO nomes values(?, ?)", (numerosx, assuntox)) #Cursor é uma variável do método __init__, por esse motivo, precisamos utilizar self. para acessá-la
        self.conectar.commit()
        self.caixa_exibição.insert(END, numerosx+" "+assuntox) #Aqui você irá inserir: 'numerox assuntox', do modo como estava fazendo, você inseria um por vez, fazendo com que um ficasse abaixo do outro
        #self.caixa_exibição.insert(END, assuntox)

    def apag(self):
        selecionada = str(self.caixa_exibição.get(ACTIVE)).replace('(','').replace(')','').replace("'","").split(',') #Coleta a linha selecionada, e por ser uma string, eu faço o tratamento da linha, removendo varias coisas como "(')". Além disso, estou fazendo um array, separando os elementos por ",".
        try:
            self.numerosy = selecionada[0]
            self.assuntoy = selecionada[1][1:]
        except:
            selecionada = str(self.caixa_exibição.get(ACTIVE)).split(" ")
            self.numerosy = selecionada[0]
            self.assuntoy = selecionada[1]

        self.cursor.execute("DELETE FROM nomes WHERE numeros='"+self.numerosy+"' AND assunto = '"+self.assuntoy+"'") #Corrigi a Query
        self.conectar.commit()
        self.caixa_exibição.delete(ANCHOR)
    def __init__(self):
        janela_principal = Tk()
        janela_principal.geometry("400x400+50+50")
        #janela_principal.overrideredirect(True)

        lb0 = Label(janela_principal)
        lb0.grid(row=0, column=0, padx=13)


        lb1 = Label(janela_principal, text="Digite um número:")
        lb1.grid(row=1, column=1, sticky=E)
        self.digite_numero = Entry(janela_principal, width=35)
        self.digite_numero.grid(row=1, column=2, sticky=W)
        separador = Frame(janela_principal, height=2, bd=3, relief=SUNKEN, width=340)
        separador.grid(row=2, column=1, columnspan=2)

        lb2 = Label(janela_principal, text="Assunto:")
        lb2.grid(row=3, column=1, sticky=E)
        self.digite_assunto = Entry(janela_principal, width=35) #Usar self. para tornar a variável acessível
        self.digite_assunto.grid(row=3, column=2, sticky=W)

        separador = Frame(janela_principal, height=2, bd=3, relief=SUNKEN, width=340)
        separador.grid(row=4, column=1, columnspan=2)

        add = Button(janela_principal, text="ADICIONAR NOME", relief=SOLID, border=1, foreground="BLUE", command=self.adic)
        add.grid(row=5, column=2, columnspan=2, sticky=W)
        apagar = Button(janela_principal, text="APAGAR NOME", relief=SOLID, border=1, foreground="RED", command=self.apag)
        apagar.grid(row=5, column=2, sticky=E)


        lb3 = Label(janela_principal)
        lb3.grid(row=6, column=0)


        rolagem = Scrollbar(janela_principal)
        rolagem.grid(row=7, column=2, sticky=N+S+E)

        self.caixa_exibição = Listbox(janela_principal, relief=SOLID, border=1, width=45, height=15, font=("Gentium Basic", 11))
        self.caixa_exibição.grid(row=7, column=1, columnspan=2, sticky=W)


        #for i in range(100):
        #    caixa_exibição.insert(END, i)

        # attach listbox to scrollbar
        self.caixa_exibição.config(yscrollcommand=rolagem.set)
        rolagem.config(command=self.caixa_exibição.yview)



        #Banco
        self.conectar = sqlite3.connect("numeros.db")
        self.cursor = self.conectar.cursor()
        self.cursor.execute("CREATE TABLE IF NOT EXISTS nomes(numeros TEXT, assunto TEXT)")
        self.conectar.commit()
        self.lista = self.cursor.execute("SELECT * FROM nomes")
        for i in self.lista:
            self.caixa_exibição.insert(END, i)


        janela_principal.mainloop()

Principal()
    
09.08.2018 / 14:02
4

In this case it is quite simple: you are doing a class, not with loose functions - so when declaring command=... , instead of command=adic , you should use command=self.adic .

And, of course, since they are methods, put the self parameter in their definition.

If you want to use only as a function, that's fine - then just remove them from the body of the class (by indenting them in the zero column), there you do not need self.adic nor self , but there you you also can not share variables between your functions.

The advantage of doing everything as a class (without inheriting any tkinter class exactly as it is in your code) is that you can define variables in __init__ that will be class attributes - then its% % needs to access adic for example - it can do this, if both caixa_exibicao and method you always use __init__ . Add self.caixa_exibicao to all variables you need to access from all functions in your code.

( self. is for self. and all other variables you share, of course).

    
09.08.2018 / 14:31