2017-09-04 4 views
-1

Ceci est mon code. Quand j'essaye d'exécuter ce code. Je fais face à l'erreur suivante. Tout le monde peut me suggérer comment corriger cette erreur et ce script peut s'exécuter avec succès.Erreur avec SQLite3 sur Python

from tkinter import * 
import sqlite3 

global a, b 

def sair_mestre(): 
    global mestre 
    mestre.quit() 

def criar_tabela(): 
    c.execute("CREATE TABLE IF NOT EXISTS Registro (Nome text, Senha text)") 

def receberl(): 
    global Nome, Senha 
    Nome = entradalogin.get() 
    Senha = entradasenha.get() 
    ler_dados(Senha) 
    if x: 
     sucesso = Label(mestre, text="Login Realizado com sucesso!") 
     sucesso.grid(row=1,column=1) 
    else: 
     inexistente = Label(mestre, text="Login errado") 
     inexistente.grid(row=1, column=1) 

def receber2(): 
    logincadastro2 = entradalogin2.get() 
    senhacadastro2 = entradasenha2.get() 
    c.execute("INSERT INTO Registro VALUES(?, ?)", (logincadastro2, senhacadastro2)) # Utilização de Variáveis 
    conexao.commit() 
    cadastro.destroy() 

    realizado = Label(mestre, text="Cadastrado com sucesso") 
    realizado.grid(row=1, column=1) 

    botaorealizado = Button(mestre, text="Ok", command=sair_mestre) 
    botaorealizado.grid(row=2, column=1) 

def registro(): 
    programa.destroy() 

    global cadastro 
    cadastro = Frame(mestre) 
    cadastro.grid() 

    realizando_cadastro = Label(cadastro, text="Realizando Cadastro...") 
    realizando_cadastro.grid(row=0, column=1) 

    labellogin = Label(cadastro, text="Login") 
    labellogin.grid(row=1, column=0) 

    labelsenha = Label(cadastro, text="Senha") 
    labelsenha.grid(row=2, column=0) 

    global entradalogin2 
    entradalogin2 = Entry(cadastro) 
    entradalogin2.grid(row=1, column=1) 

    global entradasenha2 
    entradasenha2 = Entry(cadastro, show="•") 
    entradasenha2.grid(row=2, column=1) 

    botaocadastro = Button(cadastro, text="Ok", command=receber2) 
    botaocadastro.grid(row=3, column=1) 

def ler_dados (valorbusca): 
    global row 
    global x 
    buscar_dados = "SELECT * FROM Registro WHERE Nome = ? AND Senha = ?" 
    for row in c.execute(buscar_dados, (valorbusca,)): 
     if Nome and Senha in row: 
      x = True 


conexao = sqlite3.connect("Registro_Cadastro.db") 
c = conexao.cursor() 

criar_tabela() 

mestre = Tk() 

programa = Frame(mestre) 
programa.grid() 

login = Label(programa, text="Login") 
login.grid(row=0, column=0) 

global entradalogin 
entradalogin = Entry(programa) 
entradalogin.grid(row=0, column=1) 

senha = Label(programa, text="Senha") 
senha.grid(row=1, column=0) 

global entradasenha 
entradasenha = Entry(programa, show="•") 
entradasenha.grid(row=1, column=1) 

botaook = Button(programa, text="Entrar",command= receberl) 
botaook.grid(row=2, column=1) 

botaoregistro = Button(programa, text="Cadastro",command= registro) 
botaoregistro.grid(row=3,column=1) 

mestre.mainloop() 

Ceci est l'erreur lancée par mon programme. Quelqu'un peut-il m'aider à résoudre cette erreur? Je pense que l'erreur est dans la fonction receberl.

File "-------", line 1558, in __call__ 
    return self.func(*args) 

File "------", line 17, in receberl 
    ler_dados(Senha) 

File "------", line 69, in ler_dados 
    for row in c.execute(buscar_dados, (valorbusca,)): 
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 1 supplied. 

Répondre

2

Vous devez fournir 2 arguments pour cette requête:

buscar_dados = "SELECT * FROM Registro WHERE Nome = ? AND Senha = ?" 

Lorsque vous appelez ler_dados(Senha) dans la fonction receberl, ressemble Nome manque.

Vous devez utiliser quelque chose comme: ler_dados(Nome, Senha) premier

puis changer la méthode ler_dados à:

def ler_dados (nome, senha): 
    global row 
    global x 
    buscar_dados = "SELECT * FROM Registro WHERE Nome = ? AND Senha = ?" 
    for row in c.execute(buscar_dados, (nome, senha)): 
     if Nome and Senha in row: 
      x = True 
+0

** J'ai fait deux changements suggérés et donnez cette erreur maintenant: ** Exception dans le rappel Tkinter Traceback (appel le plus récent dernier): Fichier "-----", ligne 1558, dans __call__ return self.func (* args) File "- --- ", ligne 16, in receberl Nome = entradalogin.get() Fichier "-----", ligne 2530, dans get return self.tk.call (self._w, 'get') _tkinter.TclError: nom de commande invalide ".5288976.5207312" –

+0

quelle erreur obtenez-vous? – PRMoureu

3

Le message d'erreur que vous obtenez est assez clair: votre requête SELECT lie deux paramètres, mais votre le code en spécifie seulement un. Pour fixer, d'abord changer votre appel à ler_dados() pour passer à la fois le nom d'utilisateur et mot de passe:

def receberl(): 
    global Nome, Senha 
    Nome = entradalogin.get() 
    Senha = entradasenha.get() 
    ler_dados(Nome, Senha) 
    # ... etc. 

Et puis dans votre bind requête à la fois le nom d'utilisateur et mot de passe:

def ler_dados(username, valorbusca): 
    global row 
    global x 
    buscar_dados = "SELECT * FROM Registro WHERE Nome = ? AND Senha = ?" 
    for row in c.execute(buscar_dados, (username, valorbusca,)): 
     if Nome and Senha in row: 
      x = True 
+0

J'ai fait les deux suggestions de modifications et de donner cette erreur maintenant: Exception dans le rappel Tkinter Traceback (dernier appel dernier): Fichier "-----", ligne 1558, dans l'appel de retour self.func (* args) Fichier "- --- ", ligne 16, dans receberl Nome = entradalogin.get() Fichier" ----- ", ligne 2530, dans get return self.tk.call (self._w, 'get') _tkinter.TclError: nom de commande invalide ".5288976.5207312" –

+0

Votre code est plein d'erreurs, vous devez utiliser un débogueur. –

+0

Pouvez-vous me donner des exemples? Pls –