【问题标题】:Searching for a StringVar within a List在列表中搜索 StringVar
【发布时间】: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 变量不支持这一点)。

标签: python list tkinter


【解决方案1】:

你需要更换:

        if self.user_E in self.userlist:
            if self.pass_E in self.passlist:

与:

        if self.user_E.get() in self.userlist:
            if self.pass_E.get() in self.passlist:

由于self.userlistself.passlist 是字符串对象列表,而self.user_Eself.pass_EStringVar 对象,如果您想看到它们的字符串包含在字符串对象列表中,则必须先将它们转换为字符串.

【讨论】:

    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 2014-02-14
    • 2015-03-02
    • 2010-10-16
    • 1970-01-01
    • 2022-10-22
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多