【问题标题】:Inserting user and password with SQLITE/PYTHON使用 SQLITE/PYTHON 插入用户和密码
【发布时间】:2015-10-28 14:52:56
【问题描述】:

在一个有用户和密码的小组程序上工作。我们正在尝试通过 python 将我们的用户和密码插入到 sqlite。但是 atm 我们只是在我们的图形窗口弹出一个应该发送数据的按钮之前发送空白数据。我们尝试了在多个网站上发现的不同变体,但似乎没有任何效果。

from tkinter import *
import sqlite3
import sys




conn = sqlite3.connect('indexCards.db')
cur = conn.cursor()
users ={}

def addUser(entUsername, entPassword):

    #global entUsername, entPassword
    NAME = entUsername.get()
    PASSWORD = entPassword.get()
    print("add User") #this is testing only
    print(NAME, PASSWORD) # this is testing to see the passed variable
    //
   //This is where we are having the issues
    conn.executemany('INSERT INTO USER(NAME,PASSWORD)\
          VALUES (? ,?);', [(NAME,PASSWORD)])
    conn.commit();

    return (NAME, PASSWORD)


def makeWindow():
    global entUsername, entPassword
    window = Tk()
    window.title('Add New User')

    lblInst = Label(window, text = "Create your account here:", font=("Helvetica",16))
    lblInst.pack()
    lblUsername = Label(window, text="Please enter a username: ")
    entUsername = Entry(window)
    lblUsername.pack()
    entUsername.pack()


    lblPassword = Label(window, text="Please enter a password: ")
    entPassword = Entry(window)

    lblPassword.pack()
    entPassword.pack()


    btn = Button(window, text="Create", command=addUser(entUsername, entPassword))

    btn.pack()
    print (addUser(entUsername, entPassword))
    print('entUsername', 'entPassword')

    #window.mainloop()

    return window



#if __name__ == '__main__':
 #   main():

window = makeWindow()
window.mainloop()

【问题讨论】:

  • conn.executemany('INSERT INTO USER(NAME,PASSWORD)\ VALUES (? ,?);', [(NAME,PASSWORD)]) -> conn.execute('INSERT INTO USER(NAME,PASSWORD) VALUES (? ,?);', (NAME,PASSWORD))。但是,您是否真的要将纯文本密码存储到数据库中?
  • 这个程序并不真正需要安全性,因为它只是一个类。我们真的不需要用户和密码,我只需要能够将信息发送到 sql 数据库而不是空白。

标签: python sqlite tkinter


【解决方案1】:

问题是您在用户有机会输入任何数据之前立即调用该函数。

Why is Button parameter “command” executed when declared?

【讨论】:

【解决方案2】:

它立即调用该方法并且按下按钮没有执行任何操作的原因是 addUser(entUsername, entPassword) 被评估并且其返回值被归因于按钮的命令。因此,如果 addUser 打印出一些信息来告诉您它已运行并返回 None,您只需运行 addUser 来评估其返回值并给出 None 作为按钮的命令。
要使用按钮来调用具有不同参数的函数,您可以使用全局变量,尽管我不推荐它:

import sqlite3
from tkinter import *

conn = sqlite3.connect('indexCards.db')
cur = conn.cursor()
users = {}
cur = conn.cursor()
cur.execute('''
Create table if not exists USER(NAME varchar(100), PASSWORD varchar(100))
''')


def addUser():
    NAME = entUsername.get()
    PASSWORD = entPassword.get()
    print("add User")  # this is testing only
    print(NAME, PASSWORD)  # this is testing to see the passed variable
    # This is where we are having the issues
    conn.executemany('INSERT INTO USER(NAME,PASSWORD) VALUES (? ,?);', [(NAME, PASSWORD)])
    conn.commit()

    return (NAME, PASSWORD)


def makeWindow():
    global entUsername
    global entPassword
    window = Tk()
    window.title('Add New User')

    lblInst = Label(window, text="Create your account here:", font=("Helvetica", 16))
    lblInst.pack()
    lblUsername = Label(window, text="Please enter a username: ")
    entUsername = Entry(window)
    lblUsername.pack()
    entUsername.pack()

    lblPassword = Label(window, text="Please enter a password: ")
    entPassword = Entry(window)

    lblPassword.pack()
    entPassword.pack()

    btn = Button(window, text="Create", command=addUser)

    btn.pack()
    print(addUser())

    window.mainloop()

    return window

window = makeWindow()


如果您不想创建全局,则可以将带有多个参数的函数传递给匿名函数,即 lambda 函数

btn = Button(window, text="Create", command= lambda : addUser(entUsername, entPassword))

【讨论】:

  • 欢迎来到 Stack Overflow。没有任何解释的代码转储很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请edit您的问题并解释它如何比OP提供的更好。
猜你喜欢
  • 2017-07-18
  • 2021-06-25
  • 2019-09-03
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多