-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtext_doc.txt
203 lines (144 loc) · 9.8 KB
/
text_doc.txt
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
Приложение с графическим интерфейсом для инвентаризации книг.
Приложение создано с использованием GUI библиотеки Tkinter и библиотеки SQLite для работы с базой данных.
Приложение имеет 4 текстовых поля для ввода данных о книге (Название, Автор, Год и ISBN уникальный идентификационный номер)
и сохранения их в базе.
С помощью кнопок приложения, пользователь может добавить новую книгу в базу, изменить данные о книге, найти книгу по одному из
четырех параметров и вывести информацию на экран, посмотреть все записи о книгах, удалить запись.
Создание:
Начнем с создания Frontend файла. Создадим графический пользовательский интерфейс: главное окно, кнопки, поля ввода,
скроллер, которые пока не будут выполнять никаких функций.
1. Создадим главное окно.
window = Tk()
window.mainloop()
2. Создадим виджеты.
Метки:
l1=Label(window,text="Title")
l1.grid(row=0,column=0) # используем метод grid
Текстовые поля ввода:
title_text = StringVar()
e1 = Entry(window, textvariable=title_text)
e1.grid(row=0,column=1)
Список (Listbox):
list1 = Listbox(window, height=6, width=35)
list1.grid(column=0, row=2,rowspan=6,columnspan=2)
Скроллер:
sb1 = ttk.Scrollbar(window, orient=VERTICAL, command=list1.yview)
sb1.grid(column=2, row=2,rowspan=6)
list1.configure(yscrollcommand=sb1.set) # применение метода configure к списку listbox
sb1.configure(command=list1.yview)
Кнопки:
b1 = Button(window, text='View all', width=12)
b1.grid(row=2,column=3)
Создадим Backend файл с функциями просмотра, поиска, добавления, удаления, редактирования записей.
То есть, определим функции для каждой из созданных кнопок.
Задействуем бибилиотеку SQLite3 для работы с базой данных и вызова данных на наш пользовательский интерфейс.
1. Создадим базу данных и подключимся к ней.
def connect():
conn = sqlite3.connect("books.db")
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS book (id INTEGER PRIMARY KEY, title text, author text, year integer, isbn integer)")
conn.commit()
conn.close()
2. Функция вставки данных.
def insert(title, author, year, isbn):
cur = conn.cursor()
cur.execute("INSERT INTO book VALUES (NULL, ?, ?, ?, ?)",(title, author, year, isbn))
NULL означает, что id будет создан автоматически.
4 знака ? для каждого из аргументов функции.
Далее передаем параметры (title, author, year, isbn) в качестве второго параметра функции execute.
3. Функция просмостра записей.
def view():
cur.execute("SELECT * FROM book")
4. Функция поиска.
def search(title="", author="", year="", isbn=""):
conn = sqlite3.connect("books.db")
cur = conn.cursor()
cur.execute("SELECT * FROM book WHERE title=? OR author=? OR year=? OR isbn=?",(title, author, year, isbn))
rows = cur.fetchall()
conn.close()
return rows
Задействован OR поиск. Это значит, что пользователь может ввести имя автора, год, назавание, или номер книги
(title, author, year, isbn), либо все параметры вместе. Допустим, если введен только год написания, то будут показаны
все книги, вышедшие в указанном году.
(title="", author="", year="", isbn="") Пустые строки в качестве значений нужны, чтобы не возникала ошибка
в случае, если будет введен аргумент только для одного из параметров, а оставшиеся параметры останутся без значений.
5. Функция удаления записей.
def delete(id):
Функция принимает id в качестве параметра для удаления из базы данных строки с данным id.
6. Функция обновления записей.
def update(id, title, author, year, isbn):
7. Функция проверки нахождения книги в базе.
def exists(title="", author="", year="", isbn=""):
cur.execute("SELECT * FROM book WHERE title=? AND author=? AND year=? AND isbn=?",(title, author, year, isbn))
Функция такая же, как и функция Search, только вместо OR поиска задействован AND поиск.
Связываем фронтенд с бэкендом
1. Кнопка View all
b1 = Button(window, text='View all', width=12, command=view_command)
b1.grid(row=2,column=3)
command=view_command Функция view_command нужна чтобы получать данные функции view файла backend.py
и вставлять эти данные в listbox в нашем GUI.
Используем цикл for для итерации списка кортежей и вывода их в качестве строк в listbox:
def view_command():
list1.delete(0, END) # удаляет все записи из listbox прежде чем выводить данные
for row in backend.view():
list1.insert(END, row)
2. Кнопка Search entry
def search_command():
list1.delete(0, END)
for row in backend.search(title_text.get(), author_text.get(), year_text.get(), isbn_text.get()):
list1.insert(END, row)
Параметры для функции search берем из виджетов текстовых полей ввода.
Метод .get() нужен так как title_text или author_text типы данных StringVar(), а не просто строка.
3. Кнопка Add entry
def add_command():
backend.insert(title_text.get(), author_text.get(), year_text.get(), isbn_text.get())
list1.delete(0, END)
list1.insert(END, (title_text.get(), author_text.get(), year_text.get(), isbn_text.get()))
4. Кнопка Delete selected
Функция delete принимает id в качестве аргумента и удаляет строку с соответсвующим id из базы данных.
Соответсвенно, когда пользователь выбирает одну из строк в списке Listbox, мы должны получить id выбранной
строки и передать его параметром в функцию delete файла backend.py
list1.bind('<<ListboxSelect>>', get_selected_row)
Метод bind привяжет функцию к виджету Listbox
Далее определим функцию get_selected_row в начале.
def get_selected_row(event):
try:
global selected_tuple # глобальная переменная для использования в функции delete_command
index=list1.curselection()[0] # получаем индекс выбранной строки
selected_tuple=list1.get(index) # получаем кортеж со значениями строки
Далее отправим id выбранного кортежа в функцию delete файла backend.py
def delete_command():
backend.delete(selected_tuple[0])
Для заполнения текстовых полей элементами кортежа, используем функцию insert виджета entry.
e1.delete(0,END) # удаляет данные из текстового поля
e1.insert(END,selected_tuple[1]) # selected_tuple[1] - соответсвенно название книги
e2.delete(0,END)
e2.insert(END,selected_tuple[2]) # selected_tuple[2] - автор книги
Функция get_selected_row полностью выглядит так:
def get_selected_row(event):
try:
global selected_tuple
index=list1.curselection()[0]
selected_tuple=list1.get(index)
e1.delete(0,END)
e1.insert(END,selected_tuple[1])
e2.delete(0,END)
e2.insert(END,selected_tuple[2])
e3.delete(0,END)
e3.insert(END,selected_tuple[3])
e4.delete(0,END)
e4.insert(END,selected_tuple[4])
except IndexError:
pass
Обработка исключений try except нужна, чтобы не возникала ошибка IndexError, в случае, если пользователь кликнет
по пустому списку Listbox.
5. Кнопка Update selected
def update_command():
if len(exists_command())>0:
list1.delete(0,END)
list1.insert(END,"ERROR! :: Book Already Exists")
else:
backend.update(selected_tuple[0], title_text.get(), author_text.get(), year_text.get(), isbn_text.get())
if else оператор нужен на случай если книга уже находится в базе. Будет выдана ошибка: Такая книга уже есть!
6. Кнопка Close
b6 = Button(window, text='Close', width=12, command=window.destroy)