попытка создать страницу входа в систему, на которой данные (электронная почта и пароль) хранятся и считываются из текстового файла, не работает

#python #tkinter

Вопрос:

адрес электронной почты и пароль успешно сохраняются в текстовом файле, но я не слишком уверен, как сделать так, чтобы он считывал эти данные и указывал, есть ли адрес электронной почты и пароль в списке. я попробовал и сделал функцию «читать информацию», составил список там, где он берет то, что есть в текстиле, и помещает это в список. несмотря ни на что, вывод всегда будет «неверный адрес электронной почты или пароль». Я не слишком уверен, что мне делать. Спасибо вам за помощь

     from tkinter import*
    from PIL import Image, ImageTk
    import tkinter as tk
    
    root = Tk()
    root.geometry('670x466')



    class Goode_brothers:


    def __init__(self, parent):

        myFrame = Frame(parent)
        myFrame.pack()


        self.load = Image.open('new-dip-project\food.jpg')
        self.render = ImageTk.PhotoImage(self.load)
        self.img = Label(parent, image = self.render)
        self.img.place(x = -26, y =0)

        self.img_login = PhotoImage(file = 'new-dip-project\button (3).png')
        self.b1 = Button(parent,image = self.img_login, command = self.read_info, bd = 0, bg = '#3b353b', activebackground = '#3b353b')
        self.b1.place(x = 275, y = 310)



        self.img_register = PhotoImage(file = 'new-dip-project\register.png')
        self.b2 = Button(parent,image = self.img_register, command = self.openNewWindow, bd = 0, bg = '#3b353b', activebackground = '#3b353b')
        self.b2.place(x = 265, y = 400)

        self.canvas = Canvas(parent, width = 400, height = 120)
        self.canvas.pack()
        self.img4 = ImageTk.PhotoImage(Image.open('new-dip-project\goode.png'))
        self.canvas.create_image(20, 20, anchor=NW, image=self.img4)



        self.email = Entry(parent).place(x = 340, y = 180)
        self.password = Entry(parent).place(x = 340, y = 250)

        self.img_label = PhotoImage(file = 'new-dip-project\label-image.png')
        self.name = Label(parent, image = self.img_label, text = "Email:", bg = '#3c3a3b').place(x = 197,y = 178)

        self.img_label_pass = PhotoImage(file = 'new-dip-project\label_pass.png')
        self.name = Label(parent, image = self.img_label_pass, text = "Password:", bg = '#3c3a3b').place(x = 177,y = 245)




    def create_pass(self):

        self.password_length = Label(self.root2, text = '')
        self.password_length.place(x = 80, y = 140)

        self.pass_word = str(self.password2.get()) #this code is getting the users input from the password entry box

        if len(self.pass_word) >= 8: #if the characters gotten from the pasword entry is less than 8, an erorr message will appear
            self.save_info()
            self.registered = Label(self.root2, text = 'You have successfully registered, this window will now automatically close', font=("open sans", "8"))
            self.registered.place(x = 80, y = 140)
            self.root2.after(4000, self.root2.destroy)
        else:
            self.password_length.configure(text="""Your password must be atleast eight characters long. Please try again""", font=("open sans", "8"))


    def save_info(self):

         self.email_reg = str(self.email2.get())
         self.pass_word = str(self.password2.get())
         print(self.email2)
         file = open('emails.txt', 'a ')
         file.write(self.email_reg   ', '   self.pass_word   'n')



    def read_info(self):
        read_ep = open('emails.txt', 'r')
        email_list = []
        password_list = []

        for i in read_ep:
            a,b = i.split(', ')
            b = b.strip()
            email_list.append(a)
            password_list.append(b)
        data = dict(zip(email_list, password_list))

        if self.email and self.password in email_list and password_list:
            print('email and password exist')
        else:
            print('email or password wrong')



    def create_email(self):

        self.username_length = Label(self.root2, text = '', font = '40')
        self.username_length.place(x = 165, y = 140)

        self.email_reg = str(self.email2.get())

        if len(self.email_reg) >= 1: #if user has inputted a letter or number it will allow it to go to the next function
            self.create_pass()
            self.username_length.destroy()
        else:
            self.username_length.configure(text='Please enter your username or password', font=("open sans", "8"))
            self.username_length.after(3000, self.username_length.destroy)




    def openNewWindow(self):

        # Toplevel object which will
        # be treated as a new window
        self.root2 = Toplevel(root)

        # sets the title of the
        # Toplevel widget
        self.root2.title("New Window")

        # sets the geometry of toplevel
        self.root2.geometry("500x300")

        self.load2 = Image.open('new-dip-project\registerscreen3.jpg')
        self.render2 = ImageTk.PhotoImage(self.load2)
        self.img2 = Label(self.root2, image = self.render2)
        self.img2.place(x = -2, y =0)

        self.img_label2 = PhotoImage(file = 'new-dip-project\label-image.png')
        self.name = Label(self.root2, image = self.img_label, bg = '#292929').place(x = 130,y = 102)

        self.img_label_pass2 = PhotoImage(file = 'new-dip-project\label_pass.png')
        self.name = Label(self.root2, image = self.img_label_pass, bg = '#292929').place(x = 120,y = 173)

        self.email2 = Entry(self.root2)
        self.email2.place(x = 280, y = 104)

        self.password2 = Entry(self.root2)
        self.password2.place(x = 280, y = 180)

        self.img_register2 = PhotoImage(file = 'new-dip-project\register.png')
        self.b3 = Button(self.root2,image = self.img_register2, command = self.create_email, bd = 0, bg = '#0d0d0d', activebackground = '#0d0d0d')
        self.b3.place(x = 180, y = 250)

        self.img_reg2 = PhotoImage(file = 'new-dip-project\regtitle.png')
        self.name9 = Label(self.root2, image = self.img_reg2, bg = '#131313')
        self.name9.place(x = 109, y = 10)







if __name__ == "__main__":
    e = Goode_brothers(root)
    root.title('Goode brothers')
    root.mainloop()
 

Ответ №1:

В вашем коде есть несколько проблем:

  • self.email и self.password являются None из-за того, как они созданы:
 self.email = Entry(parent).place(x = 340, y = 180)
self.password = Entry(parent).place(x = 340, y = 250)
 

Вы должны использовать:

 self.email = Entry(parent)
self.email.place(x = 340, y = 180)
self.password = Entry(parent)
self.password.place(x = 340, y = 250)
 
  • Вы должны использовать self.email.get() и self.password.get() в операторе if внутри read_info() . Также неверно выражение в операторе if.

Ниже изменено read_info() :

     def read_info(self):
        email_list = []
        password_list = []

        with open("emails.txt") as read_ep:
            for i in read_ep:
                a, b = i.split(", ")
                b = b.strip()
                email_list.append(a)
                password_list.append(b)

        data = dict(zip(email_list, password_list))
        #print(data)

        email = self.email.get() # get the input email
        password = self.password.get() # get the input password

        if email in data and password == data[email]:
            print("email and password exist")
        else:
            print("email and password wrong")
 

Однако вы можете упростить read_info() , как показано ниже:

     def read_info(self):
        accounts = []
        with open("emails.txt") as read_ep:
            for line in read_ep:
                accounts.append(line.strip().split(", "))
        #print(accounts)

        credential = [self.email.get(), self.password.get()]
        if credential in accounts:
            print("email and password exist")
        else:
            print("email and password wrong")