Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/90: Рейтинг темы: голосов - 90, средняя оценка - 4.96
-6 / 1 / 0
Регистрация: 07.06.2019
Сообщений: 38

Ищу друга вместе учить Пайтон

20.06.2019, 18:37. Показов 19746. Ответов 170
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Иду друга, с которым можно будет сотрудничать и вместе учить Пайтон, быть может в дальнейшем создавать большие проекты.
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2019, 18:37
Ответы с готовыми решениями:

С чего учить пайтон
Скажите пожалуйста уважаемые! с чего начинать учить пайтон: со справочника или с учебника???

Ищу единомышленников, вместе учить
Здравствуйте, осилил прогу хело ворлд, вот дз делаю: объявите несколько переменных различных типов, Помогите! И ещу...

Посоветуйте можно ли все вместе учить
Всем привет у меня сейчас цель изучить C++,JS,Php. На C++ уже начальный опыт имеется и сейчас хочу читать Язык программирования...

170
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,303
19.04.2020, 11:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
Tcl/Tk - это какая неудобна и устаревшая штука никто даже не помнит на чем она написана
Они там барахтаются, пытаются что-то сделать, вот такое расширение добавили https://docs.python.org/3/library/tkinter.tix.html
0
-6 / 1 / 0
Регистрация: 07.06.2019
Сообщений: 38
19.04.2020, 12:08  [ТС]
tooru, быть может пора уже перейти на более высокий уровень? QT например
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.04.2020, 12:09
Ну Qt и Tk это небо и земля. Не говоря уже о том что Qt не только для GUI.
0
19.04.2020, 15:46

Не по теме:

Avazart, Новичков мало интересуют Ваши высокие материи. Меня тоже мало интересует точное соотношение между Qt и Tcl/Tk. Я не работал с PyQt, знаю только по отзывам. Но я знаю, что PyQt не входит в состав Python'а, со всеми вытекающими последствиями. И при появлении Python версии 4.0 с существенными изменениями, текущая версия PyQt перестанет работать и потребуется создание новой версии совместимой с Python 4.0 на что может потребоваться несколько лет. Кстати IronPython, также базирующийся на framework'е до сих пор не могут переделать под Python 3.0. Нет гарантии, что и с PyQt не произойдет то же самое, когда появится Python 4.0.
Поэтому я считаю, что нужно сначала изучить сам Python, включая встроенные библиотеки одной из которых является Tkinter, так как они всегда будут соответствовать любой новой версии Python. А уже потом изучать сторонние библиотеки.
Я высказал свою точку зрения.
А Вы можете наслаждаться своей демонстрацией профессионализма, на который я не претендую, но опираюсь на свой богатый жизненный опыт. Всю свою жизнь изучаю разные области знаний. Начинал с физики, потом математика, логика философия, электроника, программирование микропроцессоров, затем ассемблер и так далее переходя к языкам высокого уровня по восходящей, занимался теорией искусственного интеллекта, психологией и так далее все перечислять места не хватит.
Поэтому я мыслю как специалист широкого профиля, а ни как узкий специалист подобный Вам.:)
Все что хотел я высказал, больше с Вами в дискуссию не вступаю.
Желаю Вам профессиональных удач.

0
43 / 35 / 10
Регистрация: 16.03.2018
Сообщений: 353
19.04.2020, 16:04
Цитата Сообщение от Viktorrus Посмотреть сообщение
Лутц М. Изучаем Python (4-е издание, 2011)
Добрый день! Эта книга всё еще актуальна?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.04.2020, 16:07
Tk как я помню тоже не ставится по умолчанию. И нет гарантий что он останется в последующих версиях.
Да и "искоробочность" для такого ущербного инструмента не оправдание.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
19.04.2020, 16:09
misha_md, Я теперь изучаю книгу Лутца "Изучаем питон" 5-ое издание, она включает описание более новых версий питона, чем в 4-ом издании. Изучаю, потому что мне доставляет удовольствие изучать что нибудь новое. Сейчас моим хобби является питон. Когда то пару лет я преподавал математику в школе, и поэтому мне нравится помогать другим в обучении, сейчас питону. Но так как я сам изучаю питон по книге Лутца. То помогаю тем, кто тоже изучает Лутца "Изучаем питон". Готов помогать и Вам, если Вы возьметесь за Лутца. Тогда пришлете мне сообщение, в какой теме будете задавать свои вопросы. Могу помогать и без Лутца, но на серьезные вопросы в комментариях подробно не ответишь, поэтому все равно буду давать ссылки на Лутца.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.04.2020, 16:11
Цитата Сообщение от Viktorrus Посмотреть сообщение
Поэтому я считаю, что нужно сначала изучить сам Python, включая встроенные библиотеки одной из которых является Tkinter, так как они всегда будут соответствовать любой новой версии Python. А уже потом изучать сторонние библиотеки.
Я высказал свою точку зрения.
Это ошибочное утверждение, большинство нормальных библиотек как раз сторонние.
Можно так же вспомнить тот же urllib vs requests.

Цитата Сообщение от Viktorrus Посмотреть сообщение
Начинал с физики, потом математика, логика философия, электроника, программирование микропроцессоров, затем ассемблер и так далее переходя к языкам высокого уровня по восходящей, занимался теорией искусственного интеллекта, психологией и так далее все перечислять места не хватит.
При всем перечисленном Вы умудрились не научится: ходить по ссылками и гуглить?
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
19.04.2020, 16:16
Цитата Сообщение от Gasratov Посмотреть сообщение
Добрый день! Эта книга всё еще актуальна?
Появилось 5-ое издание, но перевод на русский превратный, со множеством ошибок, но в 5-ом есть информация о более новых версиях питона. Поэтому я рекомендую материал, который есть и в том и в другом издании изучать по 4-ому изданию, а материал которого нет в 4-ом, изучать по 5-ому изданию.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.04.2020, 16:20
Цитата Сообщение от Gasratov Посмотреть сообщение
Добрый день! Эта книга всё еще актуальна?
Мне больше понравилась книга Самерфилда.
А сейчас читаю книгу "Чистый Python" Дена Бейдера.
0
3 / 2 / 1
Регистрация: 19.04.2020
Сообщений: 56
20.04.2020, 03:17
спасибо, что ответили, у нас схожие интересы, я тоже увлекаюсь математикой, не так, чтобы высшей, на уровне средней школы, начал изучать пайтон, надеюсь нам будет что обсудить

Добавлено через 19 минут
Цитата Сообщение от Viktorrus Посмотреть сообщение
Готов помогать и Вам, если Вы возьметесь за Лутца. Тогда пришлете мне сообщение, в какой теме будете задавать свои вопросы. Могу помогать и без Лутца, но на серьезные вопросы в комментариях подробно не ответишь, поэтому все равно буду давать ссылки на Лутца.
спасибо за участие, и предложение, буду только рад!))

Добавлено через 59 минут
Цитата Сообщение от Viktorrus Посмотреть сообщение
Но так как я сам изучаю питон по книге Лутца. То помогаю тем, кто тоже изучает Лутца "Изучаем питон". Готов помогать и Вам, если Вы возьметесь за Лутца. Тогда пришлете мне сообщение, в какой теме будете задавать свои вопросы. Могу помогать и без Лутца, но на серьезные вопросы в комментариях подробно не ответишь, поэтому все равно буду давать ссылки на Лутца.
скачал лутца 5-е издание, крыса древесная на обложке приколола)
начал изучать.
0
3 / 2 / 1
Регистрация: 19.04.2020
Сообщений: 56
06.05.2020, 15:53
приступил к 4 главе, есть вопросы к тем, кто юзает пайтон на андроиде, Pydroid3
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,303
06.05.2020, 16:45
Цитата Сообщение от misha_md Посмотреть сообщение
есть вопросы
Если есть вопросы, то задавай
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.05.2020, 17:40
Да наверное писать под андроид на python не очень идея.
0
3 / 2 / 1
Регистрация: 19.04.2020
Сообщений: 56
09.05.2020, 02:26
под андроид для быстрых скриптов,мне удобно
0
3 / 2 / 1
Регистрация: 19.04.2020
Сообщений: 56
13.06.2020, 01:27
готов к дружбе!))

Добавлено через 7 минут
А вообще есть конкретный вопрос по книге Марка Лутца, у него есть такое:
#Если вы заинтересованы в том, чтобы начать с быстрого тура по Python, то я
рекомендую прочитать главы 1, 4, 10 и 28 (и возможно 26)-конец цитаты,
сейчас я изучаю 10 главу, полистал вниз и обнаружил, что последняя глава 25, часть 5 называется модули и пакеты, кто нибудь сможет мне объяснить где мне взять 26 и 28 главы книги М. Лутца, буду обязан за понятное объяснение.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
13.06.2020, 11:51
misha_md, Какое издание? Если 4-ое то там все должно быть в одной книге. Если 5-ое, то оно в двух томах
Лутц М. Изучаем Python (том 1, 5-е издание, 2019) -> содержит главы 1-25
Лутц М. Изучаем Python (том 2, 5-е издание, 2019) -> содержит главы 26-41 и Часть IX "Приложения"

Добавлено через 6 минут
misha_md, Если будут вопросы по изучению Лутца, то можете задавать их здесь.
Кстати, перевод на русский 5-го издания не качественный. Много ошибок как перевода, так и типографских.
Поэтому, при возникновении вопросов, спрашивайте, указывая страницу в книге Лутца.
0
3 / 2 / 1
Регистрация: 19.04.2020
Сообщений: 56
14.06.2020, 01:07
у меня 5 издание Лутца, два тома, мне в норм, спасибо друзья за участие, продолжаю изучать.

Добавлено через 1 минуту
Ок, спасибо!))
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
14.06.2020, 16:24
misha_md, Я сначала изучал Лутц М. Изучаем Python (4-е издание, 2011).
Прошел почти все, за исключением главы 38 "Декараторы" и главы 39 "Метаклассы".
Главу "Декараторы" я изучал. Понял, что такое декораторы и как они работают, но научится самому их создавать с ходу не осилил. Эта тема достаточно сложная, хотя и полезная. Я помню, как парню объяснял конкретный пример из книги, с которым я разобрался, но он так и не понял. За метоклассы я не брался, но постарался беглым просмотром понять, что это такое. Вроде понял. Но это еще сложнее, чем декораторы.
После чтения книги Изучаем Python, начал изучать книгу
Лутц М. Программирование на Python. Том 1 (4-е издание, 2011)
Изучив от туда главу 1 "Предварительный обзор" (мое прим. Замечательная глава), я только тогда понял как создавать свои проекты на питоне. Собственно используя эту главу, я начал и доделал свою программу теефонный справочник, которым успешно пользуюсь занеся в него все телефоны из записных книжек.
Но по ходу программирования я понял, что уже не помню материал изученный в книге Лутц М. Изучаем Python (4-е издание, 2011) и даже справочника (очень хорошего)
http://pythonz.net/references/ не достаточно. Приходилось постоянно возвращаться к книге Лутца "Изучаем Python", так как ее тоже можно использовать как справочник, но более развернутый чем указанный выше.
Но тут я понял, что те места, которые более сложные и с которыми я изучая разобрался, потом забываются.
Тогда я решил. Так как у меня есть опыт работы с СУБД MS Access по созданию баз данных (БД), то я начал вновь сначала повторно изучать Лутц М. Изучаем Python (4-е издание, 2011) попутно заполняя созданную мной БД информацией из книги Лутца, из справочника и с моими разъяснениями, которые содержат то, в чем я разобрался. Теперь я без этой БД как без рук, это моя электронная память. Реальная из-за возраста начинает подводить.
Таким образом я повторно прошел изучение книги
Лутц М. Изучаем Python (4-е издание, 2011)
Затем появилось 5-ое издание этой книги, которое содержит больше информации, так как включает сведения о более новых версиях питона, чем версия 3.0. Теперь изучаю с нуля
Лутц М. Изучаем Python (том 1, 5-е издание, 2019) попутно дополняя свою БД дополнительной информацией из этого издания.
Ну и еще, делая свой проект телефонной книги, решил оформить работу с ней с помощью графического интерфейса (формы). Плотно графику не изучал, но необходимое для проекта взял из Лутца используя часть посвященную графике, как справочник.
Лутц М. Программирование на Python. Том 1 (4-е издание, 2011) Часть III "Программирование графических интерфейсов"
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
14.06.2020, 16:47
misha_md, Вот что у меня получилось
Кликните здесь для просмотра всего текста
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()            # передача управления форме
Проект делал самостоятельно, не к кому за консультацией не обращался. Использовал только книги Лутца, справочник в интернете, ссылку на который я показал, и созданную мной БД.
После этого создал проект-шаблон, что бы быстро создавать любую программу на любую тематику, когда можно рассматривать задачу как журнал записей по определенной тематике. Эта программа работает уже с двумя модулями с распологающимися в них двума формами.
По этому шаблону за двадцать минут создал журнал-каталог книг, но не заполнив его, загорелся создать журнал всех документов, которые храняться у меня дома. Их накопилось много и не сразу находишь то что нужно. Хочу их пронумеровать прицепив стикеры и создать на питоне журнал (используя свой шаблон) по учету этих документов. Что бы быстро находить нужный.
misha_md, Я вроде ответил на твой вопрос. Если еще что интересует, то спрашивай.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2020, 16:47

Ищу друга
ищу друга с которым можно вместе изучать с# возможно рисовать арт ( немного о себе меня зовут Никита я новичок мне 15 хочу делать 2д игры...

Ищу друга
Ищу друга с которым можно было бы изучать Python,C#. И делать игры на unity. del

Ищу друга
Дорогой друг Кукури Абесадзе, Александр Семенович, напиши Александру Прохорову asewproh@gmail.com. Я скоро еду в Тбилиси, хочу увидеть Вас...

Ищу друга (Проекты+++)
Ищу друга. Будет плюсом, если: Шаришь за психологию и программирование. Читаешь книги. Пишешь программы. Учишь/знаешь английский....

Ищу сотрудника и друга для совместной работы
Привет. Я занимаюсь веб-программированием и многими другими вещами. Я ищу человека с которым можно будет совместно фрилансить и работать...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru