Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法读取sqlite数据并将其与python中的字符串进行比较_Python_Sqlite_Tkinter - Fatal编程技术网

无法读取sqlite数据并将其与python中的字符串进行比较

无法读取sqlite数据并将其与python中的字符串进行比较,python,sqlite,tkinter,Python,Sqlite,Tkinter,这里我有一些简单用户登录的基本代码 import tkinter as tk import sqlite3 conn = sqlite3.connect("test") cur = conn.cursor() cur.execute("SELECT * FROM user_info") all_rows = cur.fetchall() usernames = [] passwords = [] for row in all_rows: usernames.append(row[0])

这里我有一些简单用户登录的基本代码

import tkinter as tk
import sqlite3

conn = sqlite3.connect("test")
cur = conn.cursor()
cur.execute("SELECT * FROM user_info")
all_rows = cur.fetchall()
usernames = []
passwords = []
for row in all_rows:
    usernames.append(row[0])
    passwords.append(row[1])
print(usernames)
print(passwords)


class loginApp(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(loginPage)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

    def login_check(self, username, password):
        x = username.get()
        y = password.get()
        login_check_bool = False
        for i in range(len(usernames)):
            if x is usernames[i] and y is passwords[i]:
                login_check_bool = True
            else:
                self.switch_frame(badLogin)
                print(x + y)
        if login_check_bool is True:
            self.switch_frame(goodLogin)


class loginPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="Login to the Application", font="Arial 20 bold").pack()
        tk.Label(self, text="Username: ", font="Arial 15").pack()
        ownUser = tk.Entry(self, width=24)
        ownUser.pack()
        tk.Label(self, text="Password: ", font="Arial 15").pack()
        ownPass = tk.Entry(self, width=24, show="*")
        ownPass.pack()
        tk.Button(self, text="LOGIN", command=lambda: master.login_check(ownUser, ownPass)).pack()


class goodLogin(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="YOU'RE LOGGED IN!!!").pack()
        tk.Button(self, text="RETRY", command=lambda: master.switch_frame(loginPage)).pack()


class badLogin(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="WRONG!!!").pack()
        tk.Button(self, text="RETRY", command=lambda: master.switch_frame(loginPage)).pack()


if __name__ == "__main__":
    app = loginApp()
    app.mainloop()
它似乎工作良好,但我有一个简单的问题。我似乎无法将从测试数据库获得的数据库值与密码和用户名值进行比较。如果我使用用户名为l、密码为l的测试登录,那么它可以正常工作。有什么解决办法吗

我还有一个sqlite配置,在测试数据库中有一个简单的表,它有用户名(varchar(24))和密码(varchar(24))。我不知道这是否与它不起作用有关。谢谢

另外,print语句用于调试,抱歉。

在Python中,“is”不是比较字符串的正确方法

替换此行:

if x is usernames[i] and y is passwords[i]:

您应该克服当前的错误行为(尽管设计有足够多的问题,但您可能还有其他问题)

什么?是的。当两个操作数是同一对象时,
is
运算符只会产生
True
。如果您在程序体中硬编码了一个字符串,则有一个特定于实现的优化将该字符串内部化,与使用
is
相比,它有可能产生
True
——但是从数据库中读取不会触发此行为

另一方面,
=
操作符比较实际的字符串内容,这是比较字符串或任何其他对象是否相等的正确方法

其他问题? 很多。首先,您将数据库的所有内容读取到两个搜索不一致、不相关的内存结构中,然后从这一点开始,与Python或SQLite的搜索和比较功能相比,求助于一个非常非常“手动”的serch方法

也就是说,您将所有DB登录名和密码放在两个单独的列表中。您可能只需在
login\u check
中登录即可实现查询。如果查询未返回任何结果,则表明您的登录不正确。如果返回单个结果,则继续比较同一行中的密码。对于这个应用来说,这是一个非常明显的设计


从一开始就学习安全性因此,您正在学习更多的东西,并构建具有UI和处理数据库的应用程序-从现在起,无需以正确的方式不关心安全性和隐私:如果您将普通密码记录到数据库中,如果它泄漏,这对您来说是一个重大灾难,对所有用户来说都是一种负担(因为他们可能在其他地方重复使用相同的密码)-因此,无论何时存储密码,都要花时间使用单向加密算法进行存储-在比较密码时,对键入的密码运行相同的单向算法,并将该值与数据库中存储的值进行比较。如果坏买拿走了你的数据库数据,没有办法将编码的密码恢复为明文。Python在stdlib模块中具有良好的单向加密算法。看看那里

“无法比较”以什么方式?具体来说,出了什么问题?你期望发生什么,而实际上发生了什么?此外,您询问的是一个比较不起作用的场景,但您只给出了一个它起作用的场景示例。请举例说明你的应用程序未能满足你的期望。样本输入、期望的行为和实际的行为都会有帮助。哦,是的,对不起。如果我们以一个用户名为例,我将其与匹配的密码(设置为vraj作为用户名,密码作为密码)放入数据库中。我们得到了错误登录屏幕,即使它应该是一对匹配的。请尝试将其减少到一个。您似乎发布了很多与所问问题没有直接关系的代码。在这里,我添加了另一个用户名和密码,vpro和密码。下面是一段视频@BryanOakley,我下次会尝试这样做。谢谢你的提示。哇,我是个白痴。谢谢!现在好像在工作。很抱歉,这可能会给您带来麻烦!此外,我还将致力于修复设计,我对python还相当陌生!NP我花时间扩展了asnwer,并提供了一些额外的提示。
if x == usernames[i] and y == passwords[i]: