Python

Почему тут получается вот такая штука? (...)

Открываем программу, заполняем несколько раз поля (создаем условно говоря "базу данных", пока простой записью в файл, без SQL и настоящих баз данных). Закрываем
Потом снова открываем и вводим в поле "искомая фамилия" например Федоров. Жмякаем кнопку "искомая фамилия". Получаем в консоли вывод:
Федоров
имя: Олег
пол: мужской
возраст: 50
номер: не_указано
адрес: Печатники_Шоссейная_улица
______
Стираем из поля фамилию Федоров и пишем "Фролова". Получаем следующее:
______
Федоров
имя: Олег
пол: мужской
возраст: 50
номер: не_указано
адрес: Печатники_Шоссейная_улица
Фролова
имя: Елена
пол: женский
возраст: 18
номер: 123456
адрес: не_знаю
имя: Елена
пол: женский
возраст: 18
номер: 123456
адрес: не_знаю
==>
Фролова вывелась два раза. И повторы накапливаются с каждым разом.
Раз уж за этот вывод отвечает метод output(), создал там set который принимает имена людей из базы и по идее должен не давать выводить однофамильцев с одинаковыми именами. Но функция этот set похоже даже не видит, по крайней мере команда print(pass_name) ничего не выводит
https://pastebin.com/SyvXEgHH
BS
Bart Simpsоn
5 840
При каждом нажатии кнопки вызывается Person.create_objects
Который читает файл и по новой закидывает все что там есть в список Person.instances (предыдущие при этом никуда не испаряются)
Игорь Цыбанов
Игорь Цыбанов
34 941
Лучший ответ
Bart Simpsоn Об этом уже давно догадался... Но противоядия пока не придумал(
В вашем коде есть несколько проблем, которые вызывают ошибки в выводе результатов.

Проблема №1:
Вы инициализируете переменную pass_name внутри функции output(), и поэтому каждый раз, когда функция вызывается, эта переменная инициализируется заново. Именно из-за этой инициализации повторно записываемые записи не удаляются из вывода.

Проблема №2:
После добавления имени в pass_name, вы печатаете имя, не проверяя, есть ли оно уже в pass_name. То есть, вы сначала печатаете информацию, а затем добавляете имя. Это нужно исправить.

Проблема №3:
В функции search_name() вы сперва пытаетесь удалить содержимое поля e7, а затем из этого же пустого поля пытаетесь получить значение для Person.search .

Проблема №4:
Функция create_objects() добавляет каждую запись в Person.instances каждый раз, когда вызывается функция test_button(). Это ведет к тому, что ваши записи дублируются.

Вот исправленный метод output и функция search_name:
 @staticmethod 
def output():
inp = Person.search
print(Person.search)
test = False
pass_name = set()
for i in Person.instances:
if i.subname.strip() == inp.strip():
test = True
if i.name not in pass_name:
print(f'имя: {i.name} \nпол: {i.sex} \nвозраст: {i.age} \nномер: {i.number} \nадрес: {i.adress}')
pass_name.add(i.name)
if not test:
print('Фамилия не найдена')
print(pass_name)

def search_name():
Person.search = e7.get()
e7.delete(0, END)
Person.create_objects()
Person.output()
И модифицированный метод create_objects:
 @staticmethod 
def create_objects():
Person.instances = [] # очищаем список перед созданием новых объектов
s = Person.read_db()
for i in s:
obj = Person(*i)
Теперь повторяющиеся выводы и дублирующиеся загрузки не должны быть проблемой.
Зафар Нуров
Зафар Нуров
25 860
Bart Simpsоn Нейросеть в данном случае вообще не поняла что к чему. Мог не стараться с копипастом ее бреда
Bart Simpsоn Хотя про "все имена"... Возможно здравое зерно в этом и есть...
Bart Simpsоn Ан, нет... Там и так добавляются "все имена". Пламенный привет нейросетке
Рекомендую сразу учиться с SQL и не парить себе мозг. А так нехватает условий. Проблема самопальных баз в том, что редко применяют ключи ID, из за чего может быть перезапись или того хуже избыточность. Сама суть БД в этом и есть, обработка и хранение записей под строогим индивидуальным опознавателем.