如何在Python Tkinter中访问用户名和密码的字典数据库?

时间:2016-04-12 19:27:03

标签: python dictionary tkinter

我一直在使用Python Tkinter进行打字程序的登录屏幕,我想使用数据库以字典格式保存多个用户的信息,其中密钥是用户名和密钥的值是它的密码。然后我有两个按钮,一个是更改输入用户名的密码,另一个是登录按钮。这是我到目前为止的代码:

import tkinter as tk
import tkinter.messagebox as tm
import dbm

db=dbm.open('M:\\Python\\Typing Program\\Dictionary.db','c')
db['Mistap']='steefjabz'

class TypingLogin(tk.Tk):

def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, **kwargs)

    container=tk.Frame(self)
    container.pack(side="top", fill="both", expand=True)
    container.grid_rowconfigure(0, weight=1)
    container.grid_columnconfigure(0, weight=1)

    self.frames = {}
    for F in (LoginScreen,TestScreen):
        frame=F(container, self)
        self.frames[F]=frame
        frame.grid(row=0, column=0, sticky="nsew")
        self.ShowFrame(LoginScreen)

def ShowFrame(self, cont):

    frame=self.frames[cont]
    frame.tkraise()

class LoginScreen(tk.Frame):

def __init__(self, parent, controller):
    self.controller=controller
    tk.Frame.__init__(self, parent)

    self.usernamelabel=tk.Label(self, text="Username")
    self.passwordlabel=tk.Label(self, text="Password")

    self.usernameentry=tk.Entry(self)
    self.passwordentry=tk.Entry(self, show="*")

    self.usernamelabel.grid(row=0, sticky="e")
    self.passwordlabel.grid(row=1, sticky="e")
    self.usernameentry.grid(row=0, column=1)
    self.passwordentry.grid(row=1, column=1)

    self.loginbutton=tk.Button(self, text="Change Password", command=self.LoginButtonClicked)#When Lesson select screen is made, put navigating command here
    self.loginbutton2=tk.Button(self, text="Login")

    self.loginbutton.grid(row=2, column=1)
    self.loginbutton2.grid(row=3, column=1)

    self.pack()

def LoginButtonClicked(self):
    global db

    username=self.usernameentry.get()
    password=self.passwordentry.get()
    if username in db and password==db[username]:
        self.controller.show_frame(TestScreen)
    else:
        tm.showerror("Login error", "Incorrect Login details")

class TestScreen(tk.Frame,tk.Toplevel):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.label=tk.Label(self, text="Old Password")
    self.label2=tk.Label(self, text="New Password")
    self.label3=tk.Label(self, text="Confirm Password")

    self.entry=tk.Entry(self, show="*")
    self.entry2=tk.Entry(self, show="*")
    self.entry3=tk.Entry(self, show="*")

    self.label.grid(row=0, sticky="e")
    self.label2.grid(row=1, sticky="e")
    self.label3.grid(row=2, sticky="e")
    self.entry.grid(row=0, column=1)
    self.entry2.grid(row=1, column=1)
    self.entry3.grid(row=2, column=1)

    self.changebutton=tk.Button(self, text="Change", command=self.ChangePassword)#When Lesson select screen is made, put navigating command here
    self.changebutton.grid(row=3, column=1)

def ChangePassword(self):
    global db,username
    if self.entry.get()==db[Username] and self.entry2.get()==self.entry3.get():
        db[Username]=self.entry2.get()
    elif self.entry.get()==db[Username] and self.entry2.get()!=self.entry3.get():
        tm.showerror("Password Error", "New Password does not match Confirm Password")
    else:
        tm.showerror("Password error", "Incorrect Password")


app = TypingLogin()
app.mainloop()

如果您发现此程序存在问题和/或无法使用Python和Tkinter,请告诉我。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

问题是数据库中的键和值正在转换为bytes个对象:

db=dbm.open('M:\\Python\\Typing Program\\Dictionary.db','c')
db['Mistap']='steefjabz'
print(dict(db))

#output:  notice the b'' prefix
{b'Mistap': b'steefjabz'}

我添加.encode()将字符串从条目转换为bytes,如下所示:

    username=self.usernameentry.get().encode()
    password=self.passwordentry.get().encode()

而不是说我有无效的凭据,因为没有名为show_frame的属性而引发错误(该方法被定义为ShowFrame