【发布时间】:2017-11-22 20:04:08
【问题描述】:
我正在创建一个登录系统并尝试在出现错误消息时保留条目。我使用 StringVar 来存储条目,因此在我销毁输入框并重新制作后,条目仍然存在。但是,当我尝试使用 if 语句在我拥有的用户名和密码列表中查找 StringVar 时,它一直说用户名不存在,但我知道它确实存在。关于如何保留条目而不使用 StringVar 或如何在列表中搜索 StringVar 的任何想法?
这是我的代码:
from tkinter import *
class Login_sys(Frame):
def __init__(self,master):
super(Login_sys,self).__init__(master)
self.userlist=['user1','user2']
self.passlist=['pass1','pass2']
self.grid()
self.initial()
def initial(self):
self.CurrentError=('')
self.user_E=StringVar()
self.user_E.set('')
self.pass_E=StringVar()
self.pass_E.set('')
self.title_lbl=Label(self,text='Welcome',fg='blue')
self.title_lbl.grid(row=0,column=0,columnspan=1,sticky=W)
self.login_bttn=Button(self,text=' Log In ',fg='red',command=self.login)
self.login_bttn.grid(row=1,column=0,columnspan=1,sticky=W)
self.reg_bttn=Button(self,text=' Register ',fg='red',command=self.register)
self.reg_bttn.grid(row=2,column=0,columnspan=1,sticky=W)
def login(self):
self.title_lbl.destroy()
self.login_bttn.destroy()
self.reg_bttn.destroy()
self.LI_title_lbl=Label(self,text='Log In',fg='blue')
self.LI_title_lbl.grid(row=0,column=0,columnspan=1,sticky=W)
self.user_lbl=Label(self,text='Username:',fg='red')
self.user_lbl.grid(row=1,column=0,columnspan=1,sticky=W)
self.userE=Entry(self,text=self.user_E)
self.userE.grid(row=1,column=1,columnspan=1,sticky=W)
self.pass_lbl=Label(self,text='Password:',fg='red')
self.pass_lbl.grid(row=2,column=0,columnspan=1,sticky=W)
self.passE=Entry(self,show='*')
self.passE.grid(row=2,column=1,columnspan=1,sticky=W)
self.Confirm_bttn=Button(self,text='Confirm',fg='blue',command=self.login_confirm)
self.Confirm_bttn.grid(row=3,column=1,columnspan=1,sticky=W)
self.Back_bttn=Button(self,text='Back',fg='black',command=self.login_back)
self.Back_bttn.grid(row=3,column=0,columnspan=1,sticky=W)
self.CurrentError_lbl=Label(self,text=self.CurrentError,fg='red')
self.CurrentError_lbl.grid(row=4,column=0,columnspan=1,sticky=W)
def login_back(self):
self.LI_title_lbl.destroy()
self.user_lbl.destroy()
self.userE.destroy()
self.pass_lbl.destroy()
self.passE.destroy()
self.Confirm_bttn.destroy()
self.Back_bttn.destroy()
self.CurrentError_lbl.destroy()
self.initial()
def login_confirm(self):
self.user_E.set(self.userE.get())
self.pass_E.set(self.passE.get())
if self.user_E in self.userlist:
if self.pass_E in self.passlist:
if self.passlist.index(self.pass_E)==self.userlist.index(self.user_E):
self.logged_in()
else:
self.CurrentError='The Password Entered \nis Incorrect'
self.Login_Error()
else:
self.CurrentError='The Password Entered \nis Incorrect'
self.Login_Error()
else:
self.CurrentError='Username does not exist'
self.Login_Error()
def Login_Error(self):
self.LI_title_lbl.destroy()
self.user_lbl.destroy()
self.userE.destroy()
self.pass_lbl.destroy()
self.passE.destroy()
self.Confirm_bttn.destroy()
self.Back_bttn.destroy()
self.CurrentError_lbl.destroy()
self.login()
【问题讨论】:
-
您正在列表中寻找 StringVars 本身,而不是 StringVars 保存的文本(您通过
.get()检索)。无论如何,您的代码中没有任何东西可以从使用 StringVars 中受益。 -
我使用 StringVars 的唯一原因是在按下确认按钮时将文本保留在输入框中
-
您可以轻松地将文本保存在一个普通的 Python 变量中。唯一需要特殊 Tkinter var 类型的是
textvariable=或某些小部件的类似选项,它允许小部件状态直接绑定到 var(Python 变量不支持这一点)。