Advertisement
Alexander_Smirnov

Untitled

Jun 12th, 2024
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.42 KB | None | 0 0
  1. from tkinter import *
  2. from itertools import groupby
  3.  
  4.  
  5. try:
  6.     class Person:
  7.         instances = []
  8.         data_from_entries = ''
  9.         search = ''
  10.         save = ''
  11.  
  12.         def __init__(self, name, surname, sex, age, number, location):
  13.             self.name = name
  14.             self.surname = surname
  15.             self.sex = sex
  16.             self.age = age
  17.             self.number = number
  18.             self.location = location
  19.             self.instances.append(self)
  20.  
  21.         @staticmethod
  22.         def create_file():
  23.             file = open('objects.txt', 'w')
  24.             file.close()
  25.  
  26.         @staticmethod
  27.         def create_removed():
  28.             file = open('removed.txt','w')
  29.             file.close()
  30.  
  31.         @staticmethod
  32.         def output(a, b):
  33.             inp = Person.search
  34.             a.config(text=Person.search)
  35.             test = False
  36.             pass_name = set()
  37.             persons = ''
  38.             for i in Person.instances:
  39.                 if i.surname.strip() == inp.strip():
  40.                     test = True
  41.                     if i.name not in pass_name:
  42.                         persons += f'имя:         {i.name}\nпол:         {i.sex}\nвозраст:  {i.age} \nномер:    {i.number} \nадрес:      {i.location}\n_____________________________________________________\n'
  43.                 pass_name.add(i.name)
  44.             if test:
  45.                 b.config(text=persons)
  46.             else:
  47.                 b.config(text='Фамилия не найдена')
  48.  
  49.         @staticmethod
  50.         def append_obj_to_file():
  51.             with open('objects.txt', 'a+', encoding='utf-8') as file:
  52.                 data = Person.data_from_entries
  53.                 # print(data)
  54.                 s = file.read()
  55.                 if data.count('не указано') < 6:
  56.                     file.write(data + '|')
  57.                     file.seek(0)
  58.  
  59.         @staticmethod
  60.         def test_file_for_valid_format(n):
  61.             def test_string_has_right_format(x):
  62.                 return not bool(len(x.split('|')[:-1]) % 6) and '|' in x
  63.  
  64.             with open(n, encoding='utf-8') as file:
  65.                 s = file.read()
  66.                 if s:
  67.                     if s[-1] != '|':
  68.                         s += '|'
  69.                     if test_string_has_right_format(s):
  70.                         return s
  71.                     if s[-1] != '|':
  72.                         s += '|'
  73.                     new_n = []
  74.                     for i in range(len(s) - 1):
  75.                         if s[i] != '|' or (s[i] == '|' and s[i - 1] != '|'):
  76.                             new_n += s[i]
  77.                     new_s = ''.join(new_n)
  78.                     if new_s[-1] != '|':
  79.                         new_s += s[-1]
  80.                     if new_s[-1] != '|':
  81.                         new_s += '|'
  82.                     s = new_s
  83.                     n = s.split('|')
  84.                     r = len(n[:-1])
  85.                     if not r % 6 == 0:
  86.                         i = r
  87.                         while i % 6:
  88.                             i += 1
  89.                         res = i - r
  90.                         for i in range(res):
  91.                             s += 'не указано|'
  92.                 else:
  93.                     Person.save = ''
  94.                     # print('file is empty')
  95.                 return s
  96.  
  97.         @staticmethod
  98.         def change_file_for_valid(x):
  99.             with open(x, 'w', encoding='utf-8') as file:
  100.                 file.write(Person.save)
  101.  
  102.         @staticmethod
  103.         def read_db():
  104.             Person.save = Person.test_file_for_valid_format('objects.txt')
  105.             Person.change_file_for_valid('objects.txt')
  106.             with open('objects.txt', encoding='utf-8') as file:
  107.                 s = file.read().strip().split('|')
  108.                 res = []
  109.                 for i in range(0, len(s) - 5, 6):
  110.                     res += [s[i: i + 6]]
  111.                 return res
  112.  
  113.         @staticmethod
  114.         def create_objects():
  115.             Person.instances.clear()
  116.             s = Person.read_db()
  117.             for i in s:
  118.                 obj = Person(*i)
  119.  
  120.         @staticmethod
  121.         def draw_gui():
  122.             root = Tk()
  123.             root.geometry('600x650+200+100')
  124.             root.title('Alexander`s Notebook 1.1')
  125.             #root.iconbitmap('favicon.ico')
  126.             root.configure(bg='beige')
  127.  
  128.             def change_spaces(s):
  129.                 s = s.replace('|', '/')
  130.                 return s
  131.  
  132.             def test_button():
  133.                 result = [e1.get(), e2.get(), e3.get(), e4.get(), e5.get(), e6.get()]
  134.                 result2 = list(map(lambda x: 'не указано' if x == '' else x, result))
  135.                 for i in range(len(result2)):
  136.                     result2[i] = change_spaces(result2[i])
  137.                 Person.data_from_entries = '|'.join(result2)
  138.                 e1.delete(0, END)
  139.                 e2.delete(0, END)
  140.                 e3.delete(0, END)
  141.                 e4.delete(0, END)
  142.                 e5.delete(0, END)
  143.                 e6.delete(0, END)
  144.  
  145.                 Person.append_obj_to_file()
  146.                 Person.create_objects()
  147.  
  148.             def search_name():
  149.                 try:
  150.                     label7.config(foreground='green', justify='center', font=('verdana', 20))
  151.                     try:
  152.                         Person.create_objects()
  153.                         Person.search = e7.get()
  154.                         Person.output(label7, label8)
  155.                         e7.delete(0, END)
  156.                     except IndexError:
  157.                         label7.config(text='ошибка ввода')
  158.                         with open('objects.txt', 'w', encoding='utf-8') as file:
  159.                             file.write(Person.save)
  160.                     except FileNotFoundError:
  161.                         label7.config(text='Для создания файла с данными \nвведите первый контакт')
  162.                         Person.create_file()
  163.                 except:
  164.                     label7.config(text='Что-то пошло не так \nПерезапустите программу')
  165.                     label8.config(text='')
  166.  
  167.             def to_del_contact():
  168.                 x = e9.get()
  169.                 with open('objects.txt', encoding='utf-8') as file:
  170.                     s = file.read()
  171.                 if x in s:
  172.                     n = s.split('|')
  173.                     indexes = []
  174.                     deleted = []
  175.                     for i, f in enumerate(n):
  176.                         if f == x:
  177.                             indexes += [i]
  178.                     for i in indexes:
  179.                         if n[i - 1] == e8.get():
  180.                             deleted = n[i - 1: i + 5]
  181.                             break
  182.                     to_removed = '|'.join(deleted) + '|'
  183.                     del n[i - 1:i + 5]
  184.                     s = '|'.join(n)
  185.                     with open('removed.txt', 'a', encoding='utf-8') as file:
  186.                         file.write(to_removed)
  187.                     with open('objects.txt', 'w', encoding='utf-8') as file:
  188.                         file.write(s)
  189.                 e8.delete(0, END)
  190.                 e9.delete(0, END)
  191.  
  192.             def show_contacts():
  193.                 try:
  194.                     # сортировка по фамилиям
  195.                     with open('objects.txt', encoding='utf-8') as file:
  196.                         s = file.read()
  197.                     ns = s.split('|')[:-1]
  198.                     res = []
  199.                     for i in range(0, len(ns) - 5, 6):
  200.                         res += [ns[i: i + 6]]
  201.                     res.sort(key=lambda x: x[1])
  202.                     # сортировка однофамильцев по именам
  203.                     result = []
  204.  
  205.                     def grouper(item):
  206.                         return item[1]
  207.  
  208.                     for key, group_items in groupby(res, key=grouper):
  209.                         b = list(group_items)
  210.                         b.sort(key=lambda x: x[0])
  211.                         b = sum(b, [])
  212.                         result.append(b)
  213.                     result = sum(result, [])
  214.                     s = '|'.join(result) + '|'
  215.                     with open('objects.txt', 'w', encoding='utf-8') as file:
  216.                         file.write(s)
  217.                     # сортировка по фамилиям
  218.                     Person.create_objects()
  219.                     label7.config(foreground='blue', justify='left')
  220.                     contacts = ''
  221.                     if not Person.instances:
  222.                         label7.config(text='База контактов пуста')
  223.                     else:
  224.                         for i in Person.instances:
  225.                             contacts += f'{i.surname} {i.name}\n'
  226.                         label7.config(text=contacts, font=('verdana', 10))
  227.                         label8.config(text='')
  228.                 except:
  229.                     label7.config(text='')
  230.                     label8.config(text='Что-то пошло не так \nПерезапустите программу')
  231.  
  232.             def restore_contacts():
  233.                 Person.save = Person.test_file_for_valid_format('removed.txt')
  234.                 Person.change_file_for_valid('removed.txt')
  235.                 s = ''
  236.                 with open('removed.txt', encoding='utf-8') as file1:
  237.                     s = file1.read()
  238.                 # print(s)
  239.                 with open('objects.txt', 'a', encoding='utf-8') as file2:
  240.                     file2.write(s)
  241.                 with open('removed.txt', 'w', encoding='utf-8') as file3:
  242.                     file3.write('')
  243.  
  244.             label1 = Label(text='Имя', bg='beige', font=('verdana', 10))
  245.             e1 = Entry(width=40)
  246.             label2 = Label(text='Фамилия', bg='beige', font=('verdana', 10))
  247.             e2 = Entry(width=40)
  248.             label3 = Label(text='Пол', bg='beige', font=('verdana', 10))
  249.             e3 = Entry(width=40)
  250.             label4 = Label(text='Возраст', bg='beige', font=('verdana', 10))
  251.             e4 = Entry(width=40)
  252.             label5 = Label(text='Номер', bg='beige', font=('verdana', 10))
  253.             e5 = Entry(width=40)
  254.             label6 = Label(text='Адрес', bg='beige', font=('verdana', 10))
  255.             e6 = Entry(width=40)
  256.             button = Button(text='Добавить контакт', foreground='red', command=test_button)
  257.             e7 = Entry(width=40)
  258.             button2 = Button(text='Искомая фамилия', foreground='green', command=search_name)
  259.             label7 = Label(text='Результат поиска', foreground='red', bg='beige', font=('verdana', 10))
  260.             label8 = Label(justify=LEFT, bg='beige')
  261.             label9 = Label(text="Удаление контактов", bg='beige', font=('verdana', 10))
  262.             e8 = Entry(width=40)
  263.             button3 = Button(text='Удалить контакт', command=to_del_contact)
  264.             label10 = Label(text="Имя", bg='beige', font=('verdana', 10))
  265.             label11 = Label(text="Фамилия", bg='beige', font=('verdana', 10))
  266.             e9 = Entry(width=40)
  267.             button5 = Button(text='Показать контакты', command=show_contacts)
  268.             button4 = Button(text='Восстановить', command=restore_contacts)
  269.  
  270.             label1.place(x=120, y=10)
  271.             e1.place(x=20, y=30)
  272.             label2.place(x=105, y=50)
  273.             e2.place(x=20, y=70)
  274.             label3.place(x=120, y=90)
  275.             e3.place(x=20, y=110)
  276.             label4.place(x=110, y=130)
  277.             e4.place(x=20, y=150)
  278.             label5.place(x=115, y=170)
  279.             e5.place(x=20, y=190)
  280.             label6.place(x=115, y=210)
  281.             e6.place(x=20, y=230)
  282.             button.place(x=85, y=260)
  283.             e7.place(x=20, y=300)
  284.             button2.place(x=85, y=330)
  285.             label7.place(x=320, y=10)
  286.             label8.place(x=300, y=50)
  287.             label9.place(x=85, y=360)
  288.             label10.place(x=120, y=380)
  289.             e8.place(x=20, y=405)
  290.             label11.place(x=105, y=425)
  291.             e9.place(x=20, y=445)
  292.             button3.place(x=85, y=475)
  293.             button4.place(x=90, y=510)
  294.             button5.place(x=78, y=565)
  295.  
  296.             e1.focus()
  297.  
  298.             root.mainloop()
  299.  
  300. except FileNotFoundError:
  301.     Person.create_file()
  302.     Person.create_removed()
  303. finally:
  304.     Person.draw_gui()
  305.  
  306.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement