我一直在使用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,请告诉我。
感谢任何帮助。
答案 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
)