Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 9

Описать класс "записная книжка"

30.06.2020, 16:06. Показов 8431. Ответов 8

Студворк — интернет-сервис помощи студентам
Очень тяжело понимать ООП, слишком много времени потратил, сильно обжегся, но так и не понял.
прошу помочь и объяснить


Описать класс ≪записная книжка≫. Предусмотреть возможность работы с произвольным числом записей, поиска записи по какому-либо признаку (например, по фамилии, дате рождения или номеру телефона), добавления и удаления записей, сортировки по фамилии и доступа к записи по номеру. Написать программу, демонстрирующую все разработанные элементы класса.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.06.2020, 16:06
Ответы с готовыми решениями:

Записная книжка
Напишите программу «Записная книжка» с графическим пользовательским интерфейсом на PyQT, используя необходимые виджеты. Пользователь...

Описать класс “записная книжка”
Подскажите, кто знает может. Описать класс “записная книжка”. Предусмотреть возможность работы с произвольным числом записей, поиска...

Описать класс «Записная книжка»
Описать класс «записная книжка». Предусмотреть возможность работы с произвольным числом записей, поиска записи по какому-либо признаку...

8
 Аватар для Semen-Semenich
5224 / 3471 / 1173
Регистрация: 21.03.2016
Сообщений: 8,298
30.06.2020, 17:45
начните с примера из жизни. что такое записная книжка? это блокнот в котором страницы. возьмем просто на странице одна запись фио и телефон. что бы посмотреть номер вам нужно открыть страницу с фио. тут страницы напоминают словарь. каждая страница это элемент где ключ фио а значение остальные данные. вот вам начало класса
Python
1
2
3
4
class Notebookr:
 
    def __init__(self):
        self.jotter = {}
а теперь попробуйте написать методы для работы с словарем согласно условию задачи.
1
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 9
30.06.2020, 18:06  [ТС]
Вот как я начинал и пробовал.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class AB:
    def __init__(self, surName, dBorn, numberT ):
        self.surName = surName
        self.dBorn = dBorn
        self.numberT = numberT
 
    def __str__(self):
        return f'{self.surName} {self.numberT} {self.dBorn}'
 
 
    def addPerson(self):
        fio = input("Фамилия: ")
        born = input("Дата рождения: ")
        num = input("Номер телефоона: ")
        return fio,born,num
Нам на парах толком ничего не стали объяснять, сказали берите и делайте.
А не сделаете к сроку, то сделаем "ай-ай-ай"
Погуглю ещё, как сделать функцию "Удаления записи"
Но сейчас я все попробую переделать с примера из жизни, в принципе меня устроил ваш ответ )
0
 Аватар для Semen-Semenich
5224 / 3471 / 1173
Регистрация: 21.03.2016
Сообщений: 8,298
30.06.2020, 19:07
ну у вас вроде как получается страница. то есть каждый экземпляр этого класса будет странице с своими данными. это сложно будет для вас хотя реализуемо. вам тогда нужно будет писать класс который будет хранить эти экземпляры и работать с ними. то есть тот пример что я выше дал будет хранить в ключе имя которое дожен вернуть ваш класс а в значение сам экземпляр. как видно очень запутанно будет пока не вникните
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Notebook:
 
    def __init__(self):
        self.jotter = {}
 
    def addPerson(self):
        fio = input("Фамилия: ")
        born = input("Дата рождения: ")
        num = input("Номер телефоона: ")
        self.jotter[fio] = [born, num]
 
    def del_name(self, name):
        if name in self.jotter:
            del self.jotter[name]
1
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 9
02.07.2020, 16:53  [ТС]
я не смог разобраться с self.jotter
как мне сделать, что б в него что-то записывалось
Прости за мои глупые вопросы)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Notebook:
 
    def __init__(self):
        self.jotter = {}
 
    def addPerson(self,):
        fio = input("Фамилия: ")
        born = input("Дата рождения: ")
        num = input("Номер телефона: ")
        self.jotter[fio] = [born, num]
 
    def del_name(self, name):
        print("Введите имя которое хотите удалить")
        if name in self.jotter:
            del self.jotter[name]
 
    def find(self, notebook):
        print("Введите имя контакта:")
        name = input()
        for contact in notebook:
            if contact['name'] == name:
                print(contact['name'],
                      contact['phone'])
                break
        else:
            print("Контакт не найден")
 
 
 
print('Телефонная книга')
print('''Выберите что выв хотите сделать
* 1 - Добавить контакт
* 2 - Найти контакт
* 3 - Удалить контакт''')
 
 
 
while True:
    print("Введите команду \n")
    command = input()
    if command == '1':
        Notebook.addPerson()
    elif command == '2':
        Notebook.find()
    elif command == '3':
        Notebook.del_name()
        break
    else:
        print('неизвестная команда')
Добавлено через 26 минут
А ещё расскажите пожалуйста, с помощью каких ресурсов вы так хорошо изучили Python и в особенности ООП
0
 Аватар для Semen-Semenich
5224 / 3471 / 1173
Регистрация: 21.03.2016
Сообщений: 8,298
02.07.2020, 18:35
Лучший ответ Сообщение было отмечено Knopkins как решение

Решение

Knopkins, не знаю прав ли буду или нет но вообще получение данных нужно убрать из класса в основной цикл. методы должны что то делать с данными (допустим изменять) и возвращать что то ( если требуется)
Цитата Сообщение от Knopkins Посмотреть сообщение
я не смог разобраться с self.jotter
как мне сделать, что б в него что-то записывалось
у вас метод addPerson как раз и записывает. создает ключ - имя а значение - список с данными

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Notebook:
 
    def __init__(self):
        self.jotter = {}
 
    def addPerson(self, key, val):
        self.jotter[key] = val
        return 'ok'
 
    def del_name(self, name):
        if name in self.jotter:
            del self.jotter[name]
            return f'{name} удален'
        return 'нет такого в списке'
 
    def find(self, name):
        for name in self.jotter:
            data = ' '.join(self.jotter[name])
            return f'{name} {data}'
        return"Контакт не найден"
 
    def info(self):
         return self.jotter.items()
 
print('Телефонная книга')
print('''Выберите что вы хотите сделать
* 1 - Добавить контакт
* 2 - Найти контакт
* 3 - Удалить контакт
* 4 - просмотреть контакты''')
 
book =  Notebook()
 
while True:
    print("Введите команду \n")
    command = input()
    if command == '1':
        fio = input("Фамилия: ")
        born = input("Дата рождения: ")
        num = input("Номер телефона: ")
        print(book.addPerson(fio, [born, num]))
    elif command == '2':
        name = input("Введите имя контакта >:  ")
        print(book.find(name))
    elif command == '3':
        name = input("Введите имя которое хотите удалить >:  ")
        print(book.del_name(name))
    elif command == '4':
        for name, data in book.info():
            data = ' '.join(data)
            print(name, data)
    else:
        print('неизвестная команда')
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
02.07.2020, 21:02
Knopkins, Я когда делал для себя телефонную книгу, начал с варианта, который предложил Вам Semen-Semenich, Но потом захотелось сделать телефонную книгу с формой, используя графический интерфейс. Но при этом размер кода значительно разбух. Старый вариант кода я удалил. Для сдачи задания используйте код, который Вам написал Semen-Semenich. А на будущее, если продолжите изучать ООП, вот код телефонной книги, с графической формой. Этой книгой я реально пользуюсь введя туда свои телефоны, которые сохраняются в компьютере отдельно в базе данных созданной с использованием модуля shelve.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# файл *.pyw (расширение .pyw необходимо для подавления окна DOS)
 
from tkinter import *                              # импорт объектов для графики
from tkinter.messagebox import *                   # импорт объектов для диалоговых окон
import shelve                                      # импорт модуля для работы с базой данных 
 
class PhoneBook:
    # класс Телефонная книга
    def __init__(self, nameBook, dicRec={}):
        # метод инициализации атрибутов экземпляров класса  и передача в метод значений для атрибутов
        self.nameBook = nameBook                   # инициализация атрибута Имя книги
        self.dicRec = dicRec                       # перечень записей в виде словаря, по умолчанию пустой
    def loadBook(self):
        # загрузка записей из базы данных
        db = shelve.open(self.nameBook)            # открытие базы данных (имя берется из атрибута nameBook экземпляра класса)
        self.dicRec = dict(db.items())             # загрузка записей из базы данных в атрибут dicRec экземпляра класса (в словарь экземпляра класса)
        db.close()                                 # закрытие базы данных
    def saveBook(self):
        # сохранение записей в базе данных
        db = shelve.open(self.nameBook)            # открытие базы данных
        for (key, record) in self.dicRec.items():  # запись содержимого из 
            db[key] = record                       # словаря экземпляра класса в базу данных
        db.close()                                 # закрытие базы данных
 
class PhoneRec:
    # класс Запись
    def __init__(self, keyRec, char, label, phone, familyName, comment, delR=''):
        # инициализация атрибутов экземпляров класса
        self.keyRec = keyRec                       # ключ записи
        self.char = char                           # буква, на странице которой находится запись
        self.label = label                         # метка, к чему относится запись
        self.phone = phone                         # телефон
        self.familyName = familyName               # Ф.И.О.
        self.comment = comment                     # комментарий
        self.delR = delR                           # служебное поле для пометки записи:
                                                   # ''- видимая, 'с' - скрытая, 'у' - удаляемая
 
fieldnamesRec = ('keyRec', 'char', 'label', 'phone', 'familyName', 'comment', 'delR')  # кортеж имен полей в записи
activCh = 'А'                                      # буква, актмвная на текущий момент
typeRec = ''                                       # тип выводимых на экран записей, '' - открытые, "с" - скрытые
dicRem = {}                                        # словарь оставшихся не выведенными записей
 
def onDeleteRequest():
#    print('Got wm delete') # щелчок на кнопке X в окне: можно отменить или перехватить
    saveRec()
    window.destroy()         # возбудит событие <Destroy>
#def doRootDestroy(event):
#    print('Got event <destroy>') # для каждого виджета в корневом окне
def makeWidgets():
    # создание графической формы
    global entriesRec, entRec, lab1, alph          # перечень глобальных переменных, которые будут использоваться и за пределами функции
    entRec = {}                                    # словарь, в который будут заносится объекты ввода entFind (поиск) и entKeyRec (ключ)
    window = Tk()                                  # создание главного окна
    window.title('Телефоны')                       # заголовок окна
    window.geometry('1260x600+0+0')                # размеры окна
#    window.bind('<Destroy>', doRootDestroy)              # для корневого и дочерних 
    window.protocol('WM_DELETE_WINDOW', onDeleteRequest) # на кнопке X окна (перехватывает нажатие кнопки Х)
    form1 = Frame(window)                          # создание внутри окна window контейнера form1
    form1.pack()
    lab1 = Label(form1, text=activCh, fg="#eee", bg="#333", width=5)  # метка, показывающая
    lab1.pack(side=LEFT)                                              # активную букву
    Label(form1, text='  ', width=30).pack(side=LEFT)                 # вспомагательная пустая метка для улучшения расположения
    alph = ["А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", 
            "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Э", "Ю", "Я"]         # список букв
    for i in range(len(alph)):                     # создание кнопок с буквами
        Button(form1, text=alph[i], command=(lambda x=alph[i]: fetchChr(x))).pack(side=LEFT)
    ent = Entry(form1, width=27)                   # поле ввода для поиска
    ent.pack(side=LEFT)
    entRec['entFind'] = ent                        # поместить объект поля ввода в словарь entRec
    Button(form1, text="Поиск", command=fetchFind).pack(side=LEFT)     # создание кнопки Поиск
 
    form2 = Frame(window)                          # создание внутри окна window контейнера form2
    form2.pack()
    entriesRec = {}                # словарь, для занесения в него объектов Entry ячеек таблицы ввода записей
    fieldnamesRecCyr = ('№№', 'Буква', 'Метка', 'Телефон', 'ФИО', 'Комментарий', 'тип')  # кортеж имен полей на руском
    for (ix, label) in enumerate(fieldnamesRecCyr): # создание надписей заголовков столбцов таблицы
        lab = Label(form2, text=label)
        lab.grid(row=2, column=ix)
    for i in range(1, 26):         # создаются ячейки таблицы для ввода записей
        for (ix, label) in enumerate(fieldnamesRec):
            if label == 'keyRec' or label == 'char' or label == 'delR':  # выделяются столбцы, которые потом будут иметь особый режим доступа
                ent = Entry(form2, state='normal', width=6)
            else:
                ent = Entry(form2, width=40)
            ent.grid(row=i+2, column=ix)
            entriesRec[label+str(i)] = ent   # объекты ячеек таблицы заносятся в словарь, причем к имени 
                                             # столбца ячейки добавляется номер строки, 
                                             # тем самым однозначно определяются координаты ячейки,
                                             # что бы к ней обращаться
    form3 = Frame(window)                            # создание внутри окна window контейнера form3
    form3.pack()
    Button(window, text="Следующая страница", command=fetchNext).pack()  # кнопка Следующая страница
    Label(window, text='      ', width=10).pack(side=LEFT)       # вспомогательная пустая метка
    labKeyRec = Label(window, text='№').pack(side=LEFT)     # надпись перед полем ввода номера ключа
    ent = Entry(window, width=10)                                # поле ввода номера ключа
    ent.pack(side=LEFT)
    entRec['entKeyRec'] = ent             # занесение объекта поле ввода номера ключа в словарь entRec
    Button(window, text="Скрыть", command=hideRec).pack(side=LEFT)             # кнопка Скрыть (запись)
    Button(window, text="Показать скрытые", command=fetchHide).pack(side=LEFT) # кнопка Показать скрытые
    Button(window, text="Открыть", command=openRec).pack(side=LEFT)            # кнопка Открыть (запись)
    Label(window, text=' ', width=5).pack(side=LEFT)                           # вспомогательная пустая метка
    Button(window, text="Удалить", command=delKeyRec).pack(side=LEFT)          # кнопка удалить (запись)
    Label(window, text='      ', width=30).pack(side=LEFT)                     # вспомогательная пустая метка
    btns = Button(window, text="Сохранить", command=interSave).pack(side=LEFT)   # кнопка Сохранить (страницу)
    Label(window, text='      ', width=20).pack(side=LEFT)                     # вспомогательная пустая метка
    Button(window, text="Выход", command=fin).pack(side=LEFT)                  # кнопка Выход (из программы)
    return window                                              # функция makeWidgets возвращает окно window
 
def clear_sheet():
    # очистка листа
    for i in range(1, 26):
        for field in fieldnamesRec:
            if field == 'keyRec' or field == 'delR':              # для очистки полей keyRec и delR,
                entriesRec[field+str(i)].config(state='normal')   # нужно открыть их для записи
                entriesRec[field+str(i)].delete(0, END)
                entriesRec[field+str(i)].config(state='readonly')
            else:
                entriesRec[field+str(i)].delete(0, END)         # очистка остальных полей
def fetchChr(ch):
    # выбрать записи на букву ch
    global activCh, typeRec, lab1
    saveRec()                      # предварительно сохранить предыдущую страницу
    typeRec = ''                   # выбор для буквы делать только из открытых записей
    activCh = ch                   # сделать ch текущей буквой
    lab1.config(text=activCh)      # написать, для какой буквы выводятся записи
    dicRecChr = {}                 # словарь, в который помещаются выбранные записи
    for key in t1.dicRec.keys():      # выбор записей и помещение их в словарь
        if t1.dicRec[key].char == ch:
            dicRecChr[key] = t1.dicRec[key]
    fetch(dicRecChr)                        # вывод записей в таблицу формы
def interSave():
    # # принудительное сохранение текущей страницы и повторный вывод записей для этой буквы начиная с первой страницы
    fetchChr(activCh)
def fetchHide():
    # вывод скрытых записей
    global typeRec, lab1
    saveRec()
    lab1.config(text='скр')
    typeRec = 'с'
    fetch(t1.dicRec)
def fetch(dicR):
    # вывод записей из заданнго словаря
    global dicRem                        # словарь записей, оставшихся не выведенными
    clear_sheet()                        # очистка таблицы
    count = 1                            # счетчик показывающий номер строки, в которую выводится запись
    dicRe = dicR.copy()                  # словарь, ведущий учет записей, которые еще не выведены
    while count <= 25 and len(dicRe):    # в цикле, заполнение строк таблицы записями
        for key in dicR.keys():            # в цикле вывод записи удовлетворяющей условию
            if dicR[key].delR == typeRec:
                record = dicR[key]                   # запись для вывода
                for field in fieldnamesRec:          # в цикле последовательное заполнение полей в строке
                    if field == 'keyRec' or field == 'delR':    # поля, которые необходимо открыть для записи
                        entriesRec[field+str(count)].config(state='normal')
                        entriesRec[field+str(count)].insert(0, getattr(record, field))
                        entriesRec[field+str(count)].config(state='readonly')
                    else:
                        entriesRec[field+str(count)].insert(0, getattr(record, field))  # все остальные поля
                count += 1         # переход к следующей строке таблицы
                dicRe.pop(key)     # удаление записи, которая выведена из словаря учета оставшихся записей           
                if count > 25:     # если все строки таблицы заполнены, то выход из цикла while
                    break
            else:
                dicRe.pop(key) # удаление из словаря учета записи, которая не удовлетворяет условию вывода в таблицу
    dicRem = dicRe.copy()      # словарь записей, оставшихся не выведенными
 
def fetchNext():
    # вывод на следующей странице записей, оставшихся не выведенными
    saveRec()
    fetch(dicRem)
 
def delKeyRec():
    # физическое удаление из базы данных записи, которая указана в ячейке entKeyRec
    key = entRec['entKeyRec'].get()  # из ячейки entKeyRec берется ключ записи для удаления
    if askyesno('Подтверждение', 'Удалить запись без возможности востановления?'):  # подтверждение на удаление
        del t1.dicRec[key]               # запись удаляется из динамического словаря t1.dicRec
        db = shelve.open(t1.nameBook)    # открывается база данных
        del db[key]                      # указанная запись физически удаляется из базы данных
        db.close()                       # база данных закрывается
        for i in range(1, 26): # ищется строка таблицы с этой записью, и помечается как удаленная, 
            if entriesRec['keyRec'+str(i)].get() == key:         # что бы потом при сохранении страницы,
                entriesRec['delR'+str(i)].config(state='normal') # она не была вновь занесена в базу данных
                entriesRec['delR'+str(i)].insert(0, 'у')
                entriesRec['delR'+str(i)].config(state='readonly')
        entRec['entKeyRec'].delete(0, END)            # очищается ячейка, содержащая номер удаляемой записи
    else:
        showinfo('Отмена', 'Удаление записи отменено')   # удаление отменено
def hideRec():
    # пометить как скрытую
    key = entRec['entKeyRec'].get()  # из ячейки entKeyRec берется ключ записи для сокрытия
    for i in range(1, 26):           # ищется строка таблицы с этой записью, и помечается как скрытая
        if entriesRec['keyRec'+str(i)].get() == key:
            entriesRec['delR'+str(i)].config(state='normal')
            entriesRec['delR'+str(i)].insert(0, 'с')
            entriesRec['delR'+str(i)].config(state='readonly')
    entRec['entKeyRec'].delete(0, END)           # очищается ячейка, содержащая номер скрываемой записи записи
def openRec():
    # открыть скрытую запись
    key = entRec['entKeyRec'].get()   # из ячейки entKeyRec берется ключ записи для открытия
    for i in range(1, 26):            # ищется строка таблицы с этой записью, и помечается как открытая
        if entriesRec['keyRec'+str(i)].get() == key:
            entriesRec['delR'+str(i)].config(state='normal')
            entriesRec['delR'+str(i)].delete(0, END)
            entriesRec['delR'+str(i)].insert(0, '')
            entriesRec['delR'+str(i)].config(state='readonly')
    entRec['entKeyRec'].delete(0, END)           # очищается ячейка, содержащая номер открываемой записи 
 
def fetchFind():
    # поиск записей по заданной строке
    global lab1
    saveRec()
    clear_sheet()
    lab1.config(text='поиск')      # сигнализирует о режиме поиска
    strF = entRec['entFind'].get().lower() # строка для поиска берется из ячейки entFind
    dicFind = {}                   # словарь, для занесения в него найденных записей
    for key in t1.dicRec.keys():   # в тлефонном справочнике ищутся записи содержащие искомую строку
        record = t1.dicRec[key]
        for field in fieldnamesRec:
            if (field != 'keyRec' and field != 'char' and field != 'delR' and # поиск в полях, за исключением перечисленных
                getattr(record, field).lower().find(strF) != -1):
                dicFind[key] = record
                break
    fetch(dicFind)                  # вывод найденных записей
def saveRec():
    # сохранение текущей страницы
    global typeRec
    for i in range(1, 26):       # просмотр строк и при наличии хотя бы в одном поле строки данных, сохранение ее
        key = entriesRec['keyRec'+str(i)].get() # проверка наличия в строке ключа
        if entriesRec['delR'+str(i)].get() == 'у': # записи помеченные как удаленные пропускаются
            continue
        elif key:                # иначе, если запись не удаленная и с ключом, то она перезаписывается
            record = t1.dicRec[key]
            for field in fieldnamesRec:
                setattr(record, field, entriesRec[field+str(i)].get())
            t1.dicRec[key] = record
        else: # иначе, если в строке нет ключа, но в одном из полей есть данные, то создается запись-экземпляр
            existRec = False                                               # и помещается а словарь t1.dicRec
            for field in fieldnamesRec:
                if entriesRec[field+str(i)].get(): existRec = True # Если существует запись в поле на этой строке
            if existRec:     # если данные в строке существуют, то создается запись
                if entriesRec['char'+str(i)].get():  # если поле буквы не пусто, то в запись заносится эта буква
                    char = entriesRec['char'+str(i)].get()
                else:              # иначе в запись заносится буква, являющаяся на данный момент активной
                    char = activCh
                label = entriesRec['label'+str(i)].get()             # заполняются переменные
                phone = entriesRec['phone'+str(i)].get()             # для формирования записи
                familyName = entriesRec['familyName'+str(i)].get()
                comment = entriesRec['comment'+str(i)].get()
                if len(t1.dicRec)>0: # если телефонный справочник не пуст, то к максимальному значению ключа 
                    L = sorted(t1.dicRec.items(), key=lambda item: int(item[0]))  # прибавляется единица
                    keyRec = str(int(L[-1][0]) + 1)
                else:        # иначе записи присваивается ключ равный 1
                    keyRec = "1"
                record = PhoneRec(keyRec, char, label, phone, familyName, comment) # создается запись, экземпляр класса PhoneRec
                t1.dicRec[keyRec] = record     #  и записывается в словарь t1.dicRec
    t1.saveBook()  # словарь t1.dicRec сохраняется во внешней базе данных "Телефоны"
 
def fin():            # сохранение перед закрытием окна
    saveRec()
    window.destroy()
 
if __name__ == '__main__':
 
    t1 = PhoneBook("Телефоны")   # создание экземпляра класса PhoneBook
    t1.loadBook()                # загрузка внешней базы данных в словарь t1.dicRec,
                                 # с которым в дальнейшем будет производится вся работа, 
                                 # перед выгрузкой потом назад в базу данных
    window = makeWidgets()       # создание формы
    fetchChr('А')                # вывод в качестве стартовой страницу с буквой "А"
    window.mainloop()            # передача управления форме


Добавлено через 4 минуты
Кстати там все строки кода закомментированы, что поможет, если захотите использовать мой код в качестве примера.
У меня код работает под питоном версии 3.7
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 9
02.07.2020, 21:10  [ТС]
Я очень сильно завидую людям, которые так хорошо умеют кодить.
Для меня код более 100 строк, это что-то с чем-то
Я не знаю, как себя правильно обучить и откуда начать.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
02.07.2020, 21:31
Цитата Сообщение от Knopkins Посмотреть сообщение
Я не знаю, как себя правильно обучить и откуда начать.
Все зависит от Вашего желания и целей. На сколько серьезно Вы Хотите научиться программированию используя питон?. Что бы реально начать писать программы требуется много времени для изучения основ программирования. Если хотите изучать программирование серьезно, то нужно изучать по книге (из двух томов) Лутц М. Изучаем Python (том 1 и том 2, 5-е издание, 2019). Но что бы было не слишком тяжело, учить нужно не все главы подряд, а в определенной последовательности.
Если же Вы хотите бегло освоить питон, то можно использовать любые другие источники. Их полно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.07.2020, 21:31
Помогаю со студенческими работами здесь

Описать класс «записная книжка»
Описать класс «записная книжка». Предусмотреть возможность работы с произвольным числом записей, поиска записи по какому-либо признаку...

Описать класс записная книжка
Описать класс «записная книжка». Предусмотреть возможность работы с произ-вольным числом записей, поиска записи по какому-либо признаку...

Описать класс «записная книжка».
1. Определить класс с именем Note, содержащий следующие поля: • Фамилия, имя; • Номер телефона; • День рождения (массив из трех...

Описать класс "моя записная книжка"
доброго времени суток! стоит задача, описать класс &quot;моя записная книжка&quot;. вопрос таков: стоит ли для этого использовать универсальный...

Описать класс "записная книжка"
Описать класс &quot;записная книжка&quot;. Предусмотреть возможность работы с произвольным числом записей по какому-либо признаку(например, по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru