Jump to content
gallows

[Resolvido] Tkinter + sqlite3 erro ao conecta

Recommended Posts

gallows

Ola pessoal sou novo aqui no fórum e também novo no Python....

estou com um problema para me conectar com o banco de dados do sqlite3

e o seguinte estou criando um programa e quero que o mesmo tenha uma tela de login e que ela esteja conectada ao banco de dados

só que não estou conseguindo fazer pesquisas de usuários sempre da erro...

ex:

def login(self):
   nome = self.nome.get() # entry nome
   senha = self.senha.get() # entry senha
   banco = self.c.cursor() # cursor
   for nome and senha in banco:
   self.janela.destroy() # se o nome e a senha estiver certos a janela login ira ser destruída
   Programa() # abrira o programa assim que a janela login for destruída

estou fazendo assim alguém poderia me dizer por favor como fazer uma pesquisa de nome e senha no banco de dados?

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
bioshock

De certeza que haverão outros utilizadores mais indicados para te ajudar, mas eu aqui à uns valentes tempos mexi em Python e olhando para o teu código actual não te vejo a fazer nenhuma query à base de dados.

Portanto, penso que o que tu queiras seja algo dentro deste género (atenção não testado):

def login(self):
nome  = self.nome.get()
senha = self.senha.get()
cr	= self.c.cursor()
cr.execute("SELECT COUNT(id) FROM utilizadores WHERE nome = %s AND senha = %s", [nome], [senha])
values = cr.fetchone()
if values[0] <= 0:
	return False # Não existe utilizador
return True

Não me lembro se [nome], [senha] está correcto ou se deveria antes ser [nome, senha]

Experimenta e diz qualquer coisa.

  • Vote 1

Share this post


Link to post
Share on other sites
gallows

Ola bioshock desde já agradeço por estar me ajudando ^^ então... tentei usar o código que você me mandou mas não funcionou acho que sou eu que estou fazendo errado fiz um código para teste vou te mandar ele...

# -*- coding:UTF-8 -*-

from Tkinter import*
import sqlite3

class login:

     def __init__(self, janela1):

           self.conectar = sqlite3.connect("USUARIO.db")
           self.c = self.conectar.cursor()
           self.c.execute("""CREATE TABLE IF NOT EXISTS usuario(nome TEXT(30),senha TEXT(10))""")
           self.conectar.commit()

           self.janela1 = janela1

           self.caixa=Frame(self.janela1)
           self.caixa.grid()
           self.l1=Label(self.caixa, text='nome:')
           self.l1.grid(row=1)
           self.l2=Label(self.caixa, text='senha:')
           self.l2.grid(row=2)

           self.en1=Entry(self.caixa)
           self.en1.grid(row=1, column=1)
           self.en2=Entry(self.caixa)
           self.en2.grid(row=2, column=1)

           self.bo=Button(self.caixa, text='Entrar', command=self.entrar)
           self.bo.grid(column=1)

     def entrar(self):
           nome  = self.en1.get()
           senha = self.en2.get()
           self.c = self.conectar.cursor()
           self.c.execute("SELECT FROM usuario WHERE nome = %s AND senha = %s", [nome], [senha])
           values = self.c.fetchone()
           if values[0] <= 0:
                 self.janela1.destroy()
                 Programa()

            #if senha =='1':
                 #self.janela1.destroy()
                 #Programa()

class sisbase:
     def __init__(self, janela):
           self.janela = janela

           caixa=Frame(self.janela)
           caixa.grid()


def Login():     
   raiz=Tk()
   acesso=login(raiz)
   raiz.mainloop()


def Programa():     
   raiz=Tk()
   raiz.geometry('400x327')
   acesso=sisbase(raiz)
   raiz.mainloop()

Login()

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites
bioshock

Que erro te é dado?

Quando escreveste o código que colocaste no tópico, nos comentários disseste o seguinte:

self.janela.destroy() # se o nome e a senha estiver certos a janela login ira ser destruída
Programa() # abrira o programa assim que a janela login for destruída

Ora, significa que o login foi feito com sucesso, correcto?

No entanto, a linha if values[0] <= 0: significa que o login está incorrecto...e não é isto que queres. Podes sempre trocar para:

if values[0] >= 1:
  self.janela1.destroy()
  Programa()

Share this post


Link to post
Share on other sites
gallows

Céus nao esta dando certo quando tento com ("SELECT FROM usuario WHERE nome = %s AND senha = %s", [nome], [senha]) da erro no [nome], [senha] diz que não e uma str

quando tento fazer sem o else: da para colocar qualquer coisa e acessar o programa mas não e isso que eu quero não e!

mas quando colocar a messagebox não da para ter acesso algum.

# -*- coding:UTF-8 -*-

from Tkinter import*
import sqlite3
import os
import tkMessageBox

class login:

     def __init__(self, janela1):


           self.conectar = sqlite3.connect("USUARIO.db")
           self.c = self.conectar.cursor()
           self.c.execute("""CREATE TABLE IF NOT EXISTS usuario(nome TEXT(30),senha TEXT(10))""")
           self.c.execute("INSERT INTO usuario VALUES ('admin','admin')")
           self.conectar.commit()

           self.tentativas=3
           self.janela1 = janela1

           self.caixa=Frame(self.janela1)
           self.caixa.grid()
           self.l1=Label(self.caixa, text='nome:')
           self.l1.grid(row=1)
           self.l2=Label(self.caixa, text='senha:')
           self.l2.grid(row=2)

           self.en1=Entry(self.caixa)
           self.en1.grid(row=1, column=1)
           self.en2=Entry(self.caixa)
           self.en2.grid(row=2, column=1)

           self.bo=Button(self.caixa, text='Entrar', command=self.entrar)
           self.bo.grid(column=1)

     def entrar(self):
           nome  = self.en1.get()
           senha = self.en2.get()
           self.c = self.conectar.cursor()
           self.c.execute("SELECT nome AND senha FROM usuario")
           values = self.c.fetchone()
           if values[0] >= 1:
                 self.janela1.destroy()
                 Programa()
           else:
                self.tentativas=self.tentativas-1    
                tkMessageBox.showerror('Usuario ou senha invalido', 'Este usuario não existe ou a senha é invalida.\nVocê só pode tentar mais %i vezes' %self.tentativas)
                if self.tentativas <=0:
                      self.janela1.destroy()



class sisbase:
     def __init__(self, janela):
           self.janela = janela

           caixa=Frame(self.janela)
           caixa.grid()


def Login():    
   raiz=Tk()
   acesso=login(raiz)
   raiz.mainloop()


def Programa():    
   raiz=Tk()
   raiz.geometry('400x327')
   acesso=sisbase(raiz)
   raiz.mainloop()

Login()

peso desculpas por incomodar mais uma vez meu querido, não só por não estar entendendo mas também por mandar o código inteiro.

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other sites
bioshock

Por acaso deste-te ao trabalho de perceber o erro? Só mesmo por acaso..

E achas que isto self.c.execute("SELECT nome AND senha FROM usuario") faz sentido?

E o erro que te dá, eu falei-te sobre ele no meu 1º post.

Não me lembro se [nome], [senha] está correcto ou se deveria antes ser [nome, senha]

http://lmgtfy.com/?q=python+parameterized+query

Share this post


Link to post
Share on other sites
gallows

Ola amigos, peço desculpas pela demora em responder quanto a você thoga31, agradeço por sua advertência e pode ter certeza que já estou estudando as regras para que isso não venha acontecer mais ^^.

bioshock, realmente não tem nexo algum oque eu fiz, infelizmente o jeito que tentei também [nome, senha] não deu certo, diz que isso não e uma str, acho que vou deixar o programa livre mesmo já que não estou conseguindo, gostaria de agradecer a todos pela atenção e sei que achei um ótimo fórum, estão de parabéns pelo trabalho que estão fazendo.

Share this post


Link to post
Share on other sites
gallows

Bom Dia! desculpe não responder ao tópico antes, quero agradecer a ajuda de todos e dizer que a ajuda de vocês foi crucial para o meu aprendizado, peço desculpas por não entender de cara oque me falavam e que como disse tenho pouco tempo de python e de programação coisas de alguns meses...

e quero dizer também que resolvi o meu problema juntamente com um grande amigo lario diniz, e quero disponibilizar aqui o código para que se alguém mais aparecer com o mesmo problema saiba como resolve-lo também!

# -*- coding:UTF-8 -*-
from ttk import *
from Tkinter import *
import tkMessageBox
import sqlite3
import os
def dic_bd(bd, tabela):
   """
    Função que recebe o banco de dados como string (bd) e
    o nome da tabela como string (tabela) e
    retorna um dicionario com todos os itens da tabela consultada.
   """
   conect=sqlite3.connect(bd)
   c = conect.cursor()
   a={}
   for i in c.execute("SELECT * FROM %s" %tabela):
    a[i[0]]=[i[1],i[2]]
   conect.close()
   return a	   
#Criando banco de dados
#====================================================================#
conectar = sqlite3.connect("banco_dados.db")
c = conectar.cursor()
c.execute("""CREATE TABLE IF NOT EXISTS produtos(id_produto INTEGER PRIMARY KEY AUTOINCREMENT, produto TEXT,ean REAL,ncm REAL)""")
c.execute("""CREATE TABLE IF NOT EXISTS usuarios(id_usuario INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT,senha TEXT)""")
a=dic_bd("banco_dados.db", "usuarios")
if a == {}:
   c.execute("INSERT INTO usuarios VALUES (NULL,?,?)",("admin","admin"))
conectar.commit()
conectar.close ()
#====================================================================#
def center(win):
   #funçao para centralizar
   win.update_idletasks()
   width = win.winfo_width()
   frm_width = win.winfo_rootx() - win.winfo_x()
   win_width = width + 2 * frm_width
   height = win.winfo_height()
   titlebar_height = win.winfo_rooty() - win.winfo_y()
   win_height = height + titlebar_height + frm_width
   x = win.winfo_screenwidth() // 2 - win_width // 2
   y = win.winfo_screenheight() // 2 - win_height // 2
   win.geometry('{}x{}+{}+{}'.format(width, height, x, y))

class login:
   acesso=0
   def __init__(self, janela):
    #==========================Configurações=============================#
    self.tentativas=3
    fonte = ('Arial','14')
    fontb = ('Arial','12')
    self.janela = janela
    self.janela.resizable(width=False, height=False)
    self.janela.title('Login')
    #==============================Frames================================#
    frame=Frame(self.janela,borderwidth=3, relief=RAISED)
    frame.pack(pady = 2, padx=2)
    titulo=Frame(frame)
    titulo.pack(pady = 1, padx=1)
    caixa=Frame(frame)
    caixa.pack(pady = 1, padx=1)
    #=============================Widgets================================#
    titulosis=Label(titulo, text='TESTE', font=fonte, fg="darkblue", width=13).grid(row=1, column=1, sticky=W, pady=3)
    name=Label(caixa, text='Nome').grid(row=1, column=1, sticky=W, pady=3)
    senha=Label(caixa, text='Senha').grid(row=2, column=1, sticky=W, pady=3)
    self.entry_name=Entry(caixa, width=10)
    self.entry_name.grid(row=1, column=2, sticky=W, pady=3)
    self.entry_name.focus_force()
    self.entry_senha = Entry(caixa, width=10, show='*')
    self.entry_senha.grid(row=2, column=2, sticky=W, pady=3)
    entrar=Button(caixa, width=8, command=self.Entrar, text="Entrar")
    entrar.grid(row=3, column=1, sticky=W, pady=3)
    sair=Button(caixa, width=8, command=self.Sair, text="Sair")
    sair.grid(row=3, column=2, sticky=W, pady=3)
   def Entrar(self):
    loguin = self.entry_name.get()
    senha = self.entry_senha.get()
    a=dic_bd("banco_dados.db", "usuarios")
    con=0
    for i in a:
	    if a[i][0] == loguin:
		    if a[i][1] == senha:
			    con=1				   
    if con==1:
	    self.janela.destroy()
	    Programa()		   
    else:
	    self.tentativas=self.tentativas-1
	    tkMessageBox.showerror('Senha  ou usuario invalido', 'Este usuario ou esta senha é invalida.\nVocê só pode tentar mais %i vezes' %self.tentativas)
	    if self.tentativas <=0:
		    self.janela.destroy()

   def Sair(self):
    self.janela.destroy()

class teste:
   def __init__(self, janela):


    #==========================Configurações=============================#
    self.abas = Notebook(janela)
    janela.resizable(width=False, height=False)
    janela.title('teste')
    font = ('Arial','14')
    fontb = ('Arial','12')
    #==============================Frames================================#
    caixa=LabelFrame(self.abas)
    caixa.grid(pady=5)
    caixa2=LabelFrame(self.abas)
    caixa2.grid()

    #=============================Widgets================================#
    self.abas.add(caixa,text='Pessoal')
    self.abas.add(caixa2,text='Cadastros')
    #abas.add(self.frame_aba3,text='Util')
    self.abas.grid()
def Login():	
   raiz=Tk()
   acesso=login(raiz)
   center(raiz)
   raiz.mainloop()
   return acesso.acesso
def Programa():	
   raiz=Tk()
   raiz.geometry('500x400')
   acesso=teste(raiz)
   center(raiz)
   raiz.mainloop()
Login()

espero que seja útil para mais alguém!!!!!

Resolvido!

Edited by gallows

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.