2017-09-04 152 views
-1

这是我的代码。当我试图运行此代码。我面临以下错误。任何人都可以建议我如何纠正该错误,并且此脚本可以成功运行。Python上的SQLite3错误

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() 

这是我的程序抛出的错误。任何人都可以帮助我解决这个错误? 我认为错误在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. 

回答

2

你需要为这个查询提供了2个参数:

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

当你在函数调用receberller_dados(Senha),貌似Nome丢失。

你应该使用类似:ler_dados(Nome, Senha)第一

,然后更改方法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

**我做了两个建议的更改并且现在给出这个错误:** Tkinter回调中的异常 Traceback(最近调用最后一次): 文件“-----”,第1558行,在__call__中 return self.func(* args) File“ - ---“,line 16,in receberl Nome = entradalogin.get() 文件“-----”,行2530,在得到 返回self.tk.call(self._w,'get') _tkinter.TclError:无效的命令名称“.5288976.5207312” –

+0

你会得到什么错误? – PRMoureu

3

你所得到的错误信息是非常明确的:你SELECT查询结合两个参数,但你的代码只能指定其中的一个。要解决,首先改变你对ler_dados()呼叫的用户名和密码都经过:

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

,然后在查询绑定两者的用户名和密码:

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

我做了两个建议的更改,现在给这个错误:在Tkinter回调Traceback(最近的最后一次调用最后)异常:文件“-----”,第1558行,在调用返回self.func(* args)文件“ - ---“,第16行,在receberl中Nome = entradalogin.get()文件”-----“,第2530行,返回self.tk.call(self._w,'get')_tkinter.TclError:无效的命令名称“.5288976.5207312” –

+0

您的代码充满了错误,您应该使用调试器。 –

+0

你能举个例子吗?请问 –