有没有办法自动创建新实例?

时间:2020-10-29 19:55:48

标签: python oop

如您所见,我可以在此处存储密码。 我必须添加一个可以注册新用户的功能。如何做到这一点,以便在创建新用户时可以创建新实例?

import datetime
import getpass

class User:
    def __init__(self, username, mail, date_of_birth, gender, password):
        self.username = username
        self.mail = mail
        self.date_of_birth = datetime.datetime.strptime(date_of_birth, "%d.%m.%Y").date()
        self.gender = gender
        self.password = password

    def get_username(self):
        return self.username

    def get_mail(self):
        return self.mail

    def get_date_of_birth(self):
        return self.date_of_birth
    def get_gender(self):
        return self.gender

    def get_password(self):
        self.password

    def get_date(self):
        return self.date_of_birth

    log = ""

    def tries_left(self):

        max_tries = 3
        trie = 0

        while trie <= max_tries:
            print("wrong password!")
            print("tries left " + str(max_tries - trie + 1))
            trie +=1
            pwrd = input("input password")
            if pwrd != self.password:
                pass
        else:
            self.login_or_register()

    def login2(self):
        global log
        log = input("input your username: ")

        if log == self.username:
            pwrd = input("whats your password?")

            if pwrd == self.password:
                print("Logged in!")
                self.add_password_orCheck_password()
            else:
                self.tries_left()

        else:
            print("wrong username!")
            self.login2()


    def login_or_register(self):
        user_input = input("Login or Register: ")

        if user_input == "login":
            self.login2()
        elif user_input == "register":
            pass
        else:
            print("Try again!")
            self.login_or_register()


    def add_password(self):
        global sitepassword
        global Site
        Site = input("Enter site name: ")
        sitepassword = input("Enter password")
        self.add_password_orCheck_password()

        global passwords
        passwords = {Site: sitepassword}

    def check_passwords(self):
        global passwords
        global sitepassword
        global Site

        passwords = {Site: sitepassword}

        which_password = input("Which sites password do you want to see?")
        for Site in passwords:
            if which_password in passwords:
                print(sitepassword)
                self.add_password_orCheck_password()


    def add_password_orCheck_password(self):
        add_new = input("Do you want to add a password or check passwords?")
        if "add a password" in add_new:
            self.add_password()
        elif "check passwords" in add_new:
            self.check_passwords()


Matt = User("Matterson", "matt@gmail.com", "21.12.1999" ,"male", "Password987")
session1 = Matt.login_or_register()

2 个答案:

答案 0 :(得分:1)

我不认为这是一个更好的选择:

users = {}

while True:
    name = input('yourtexthere')
    email = input('yourtexthere')
    year = input('yourtexthere')
    gender = input('yourtexthere')
    password = input('yourtexthere')  # here you will use getpass

    users[f'{name}'] = User(name, email, year, gender, password)

但是您也可以将它们存储在列表中,但是随后您将不得不通过索引访问它们,并且您可能希望使用电子邮件作为密钥:

users[f'{email}'] = User(name, email, year, gender, password)

答案 1 :(得分:0)

这是代码(请参阅我的评论),它不是最干净的代码,但是可以工作,在这里您可以尝试实现User类,并根据需要进行创建,但是您需要tkinter的经验(这仅仅是一个例子)希望能对您有所帮助(它还会在此codes目录中创建json文件(如果尚未创建))(并且我希望这样做不会违反某些准则):

from tkinter import *
from tkinter import messagebox
import json

all_user_pass = dict()

try:
    with open('stored_data.json') as file:
        data = json.load(file)
except:
    with open('stored_data.json', 'w') as file:
        json.dump(all_user_pass, file, indent=2)
    with open('stored_data.json') as file:
        data = json.load(file)


class MainWindow(Toplevel):
    def __init__(self, parent):
        self.parent = parent
        Toplevel.__init__(self, parent)
        self.x_tk = 310
        self.y_tk = 100
        self.win_h = int(self.winfo_screenheight()/2 - self.y_tk/2)
        self.win_w = int(self.winfo_screenwidth()/2 - self.x_tk/2)
        self.geometry(f"{str(self.x_tk)}x{str(self.y_tk)}+{str(self.win_w)}+{str(self.win_h)}")
        self.title('Login')
        self.protocol('WM_DELETE_WINDOW', self.quit)

        self.username = Entry(self, bg="grey", bd=5, font="none 12 normal")
        word_username = Label(self, text='Username:')
        word_username.grid(row=0, column=0, sticky='w')
        self.username.grid(row=0, column=1)

        self.password = Entry(self, bg="grey", bd=5, font="none 12 normal")
        word_password = Label(self, text='Password:')
        word_password.grid(row=1, column=0, sticky='w')
        self.password.grid(row=1, column=1)

        login_button = Button(self, text='Login', command=self.login)
        login_button.grid(row=2, column=0)
        self.bind('<Return>', self.login)

        signup_button = Button(self, text='Sign Up', command=self.open_signup)
        signup_button.grid(row=2, column=2)

        self.incorrect_user_or_pass = Label(self, text='Incorrect username or password!')
        self.empty_user_or_pass = Label(self, text='Cannot be blank!')

    def open_signup(self):
        signupwindow = SignUpWindow(self)
        signupwindow.focus_force()
        signupwindow.withdraw

    def login(self, event=None):
        global data

        existing_user = self.username.get()
        user_pass = self.password.get()
        self.incorrect_user_or_pass.place_forget()

        if existing_user != '' and user_pass != '':
            if existing_user in data and data[existing_user] == user_pass:
                messagebox.showinfo('Successful Login', 'You have logged in successfully!', parent=self)
                self.username.delete(0, 'end')
                self.password.delete(0, 'end')
                self.empty_user_or_pass.place_forget()
                self.incorrect_user_or_pass.place_forget()
            else:
                self.username.delete(0, 'end')
                self.password.delete(0, 'end')
                self.empty_user_or_pass.place_forget()
                self.incorrect_user_or_pass.place(x=60, y=65)
        else:
            self.empty_user_or_pass.place(x=90, y=65)


class SignUpWindow(Toplevel):
    def __init__(self, parent):
        self.parent = parent
        Toplevel.__init__(self, parent)
        self.x_tk = 310
        self.y_tk = 100
        self.win_h = int(self.parent.winfo_rooty() - 31)
        self.win_w = int(self.parent.winfo_rootx() - 8)
        self.geometry(f"{str(self.x_tk + 16)}x{str(self.y_tk + 39)}+{str(self.win_w)}+{str(self.win_h)}")
        self.title('Signup')
        self.bind('<FocusOut>', self.f_out_main)
        self.bind('<Escape>', self.close)
        self.update_idletasks()
        self.overrideredirect(True)
        self.config(bg='green')

        Label(self, text='Signup', font='none 20 normal', bg='green', bd=5) .grid(row=0, column=0, columnspan=4)

        self.username = Entry(self, bg="grey", bd=5, font="none 12 normal")
        word_username = Label(self, text='Username:', bg='green')
        word_username.grid(row=1, column=0, sticky='w')
        self.username.grid(row=1, column=1)
        self.username.bind('<FocusOut>', self.f_out)

        self.password = Entry(self, bg="grey", bd=5, font="none 12 normal")
        word_password = Label(self, text='Password:', bg='green')
        word_password.grid(row=2, column=0, sticky='w')
        self.password.grid(row=2, column=1)
        self.password.bind('<FocusOut>', self.f_out)

        cancel_button = Button(self, text='Cancel', command=self.cancel)
        cancel_button.grid(row=3, column=0)
        cancel_button.bind('<FocusOut>', self.f_out)
        cancel_button.bind('<Return>', self.cancel)

        signup_button = Button(self, text='Sign Up', command=self.signup)
        signup_button.grid(row=3, column=2)
        signup_button.bind('<FocusOut>', self.f_out)
        self.bind('<Return>', self.signup)

        self.user_taken = Label(self, text='Username already taken!', bg='green')
        self.empty_user_or_pass = Label(self, text='Cannot be blank!', bg='green')

        self.focus_list = []

    def f_out(self, event=None):
        self.focus_list.append('focus_out_of_widget')

    def f_out_main(self, event=None):
        self.focus_list.append('focus_out_of_window')
        if len(self.focus_list) >= 2:
            if self.focus_list[-2] == 'focus_out_of_window' and self.focus_list[-1] == 'focus_out_of_window':
                self.close()
        elif self.focus_list[0] == 'focus_out_of_window':
            self.close()

    def cancel(self, event=None):
        self.destroy()

    def signup(self, event=None):
        global all_user_pass
        global data

        new_username = self.username.get()
        new_password = self.password.get()
        if new_username != '' and new_password != '':
            if new_username not in data:
                if new_username not in all_user_pass:
                    all_user_pass[new_username] = new_password
                    data.update(all_user_pass)
                    with open('stored_data.json', 'w') as f:
                        json.dump(data, f, indent=2)
                    self.username.delete(0, 'end')
                    self.password.delete(0, 'end')
                    self.user_taken.place_forget()
                    self.empty_user_or_pass.place_forget()
                    self.destroy()
                else:
                    self.username.delete(0, 'end')
                    self.password.delete(0, 'end')
                    self.empty_user_or_pass.place_forget()
                    self.user_taken.place(x=90, y=110)
            else:
                self.username.delete(0, 'end')
                self.password.delete(0, 'end')
                self.empty_user_or_pass.place_forget()
                self.user_taken.place(x=90, y=110)
        else:
            self.empty_user_or_pass.place(x=90, y=110)

    def close(self, event=None):
        self.parent.focus_set()
        self.destroy()

root = Tk()
root.withdraw()
app = MainWindow(root)
app.mainloop()