Не получается взять логин из множества и сравнить с введенным в виджете значением
Имеются сохраненные объекты User в множестве database_set. У юзера есть поля (firstname, lastname, patronymic, login, password) нужно достать из множества User, а из него поле login, чтобы потом я мог сохраненные логины сравнить с введённым в виджете.
Код юзера
class User():
def __init__(self, firstname, lastname, patronymic, login, password):
self.firstname = firstname
self.lastname = lastname
self.patronymic = patronymic
self.login = login
self.password = password
def __str__(self):
return f"User(firstname={self.firstname}, lastname={self.lastname}, patronymic={self.patronymic}, " \
f"login={self.login}, password={self.password})"
from entity.user import User
database_set = set()
test_user_one = User("Arkadi", "Vartanyan", "Gevorkovich", "adik508", "ad123")
test_user_two = User("Ivan", "Ivanov", "Ivanovich", "ivan508", "ivan123")
test_user_three = User("Artem", "Artemov", "Artemovich", "artem508", "artem123")
test_user_four = User("Vasili", "Vasilev", "Vasilevich", "vasili508", "vasili123")
def save_database(user):
database_set.add(user)
print("Пользователь успешно сохранен!")
save_database(test_user_one)
save_database(test_user_two)
save_database(test_user_three)
save_database(test_user_four)
Ответы (2 шт):
Множества в Python (тип set) удобно использовать только с простыми типами, такими как строки или числа. Сохраняйте в ваше множество только логины пользователей, а не их объекты. Так будет проще выполнить проверку оператором in.
def save_database(user):
database_set.add(user.login)
print("Пользователь успешно сохранен!")
if LoginWidget.get() in database_set:
...
Тут имеет смысл использовать словарь, а не множество. В этом словаре ключи - логины, значения - сами объекты пользователей. Тогда легко через in проверить наличие логина в базе, потом по логину получить самого юзера, и потом, например, проверить пароль.
Если использовать set для хранения пользователей, то через in можно проверить разве что наличие логина (если переопределить методы __hash__ и __eq__ класса User), а сам объект придется искать перебором элементов множества.
class User():
def __init__(self, firstname, lastname, patronymic, login, password):
self.firstname = firstname
self.lastname = lastname
self.patronymic = patronymic
self.login = login
self.password = password
def __repr__(self):
return f"User(firstname={self.firstname}, lastname={self.lastname}, patronymic={self.patronymic}, " \
f"login={self.login}, password={self.password})"
# ---
# from entity.user import User
database = dict()
test_user_one = User("Arkadi", "Vartanyan", "Gevorkovich", "adik508", "ad123")
test_user_two = User("Ivan", "Ivanov", "Ivanovich", "ivan508", "ivan123")
test_user_three = User("Artem", "Artemov", "Artemovich", "artem508", "artem123")
test_user_four = User("Vasili", "Vasilev", "Vasilevich", "vasili508", "vasili123")
def add_user(user):
database[user.login] = user
print(f"Пользователь {user.login} успешно добавлен!")
add_user(test_user_one)
add_user(test_user_two)
add_user(test_user_three)
add_user(test_user_four)
def check_user(login, password):
return login in database and database[login].password == password
# ---
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
entry_login = tk.Entry(root)
entry_login.pack()
entry_password = tk.Entry(root, show="*")
entry_password.pack()
def login():
if check_user(entry_login.get(), entry_password.get()):
messagebox.showinfo("Ok", "Success!")
else:
messagebox.showerror("Error", "Wrong login or password!")
tk.Button(root, text="Login", command=login).pack()
root.mainloop()