Открываем программу, заполняем несколько раз поля (создаем условно говоря "базу данных", пока простой записью в файл, без SQL и настоящих баз данных). Закрываем
Потом снова открываем и вводим в поле "искомая фамилия" например Федоров. Жмякаем кнопку "искомая фамилия". Получаем в консоли вывод:
Федоров
имя: Олег
пол: мужской
возраст: 50
номер: не_указано
адрес: Печатники_Шоссейная_улица
______
Стираем из поля фамилию Федоров и пишем "Фролова". Получаем следующее:
______
Федоров
имя: Олег
пол: мужской
возраст: 50
номер: не_указано
адрес: Печатники_Шоссейная_улица
Фролова
имя: Елена
пол: женский
возраст: 18
номер: 123456
адрес: не_знаю
имя: Елена
пол: женский
возраст: 18
номер: 123456
адрес: не_знаю
==>
Фролова вывелась два раза. И повторы накапливаются с каждым разом.
Раз уж за этот вывод отвечает метод output(), создал там set который принимает имена людей из базы и по идее должен не давать выводить однофамильцев с одинаковыми именами. Но функция этот set похоже даже не видит, по крайней мере команда print(pass_name) ничего не выводит
https://pastebin.com/SyvXEgHH
Python
Почему тут получается вот такая штука? (...)
При каждом нажатии кнопки вызывается Person.create_objects
Который читает файл и по новой закидывает все что там есть в список Person.instances (предыдущие при этом никуда не испаряются)
Который читает файл и по новой закидывает все что там есть в список Person.instances (предыдущие при этом никуда не испаряются)
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:
Проблема №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)
Теперь повторяющиеся выводы и дублирующиеся загрузки не должны быть проблемой.
Bart Simpsоn
Нейросеть в данном случае вообще не поняла что к чему. Мог не стараться с копипастом ее бреда
Bart Simpsоn
Хотя про "все имена"... Возможно здравое зерно в этом и есть...
Bart Simpsоn
Ан, нет... Там и так добавляются "все имена". Пламенный привет нейросетке
Рекомендую сразу учиться с SQL и не парить себе мозг. А так нехватает условий. Проблема самопальных баз в том, что редко применяют ключи ID, из за чего может быть перезапись или того хуже избыточность. Сама суть БД в этом и есть, обработка и хранение записей под строогим индивидуальным опознавателем.
Похожие вопросы
- Что-то не получается дописать правильно код на Питоне
- Задача в Python? Помогите решить, не получается! Решить нужно без функций и методов. Только циклы и условные операторы.
- У вас получалось написать разом целую страницу кода и не сделать ни одной ошибки?
- Помогите с задачей по Python. Одно задание осталось, что-то не получается.
- Не получается решить задачу по Python, как решить?
- Помогите пожалуйста соединить два кода в один,очень долго пытался,но всё равно не совсем правильно получается
- Какое слово получается
- Почему чат боты не могут запомнить, что было в предыдущем предложении?
- Почему за Питона столько голосов? Почему он сложнее того же C или JS?
- Почему остаток от деления 7 % 5 = 2, если он равен 1.4?