· 4 years ago · Mar 15, 2021, 05:54 PM
1import tkinter as tk
2from tkinter import ttk
3import sqlite3
4
5
6class Main(tk.Frame):
7 def __init__(self, root):
8 super().__init__(root)
9 self.init_main()
10 self.db = db
11 self.view_records()
12
13 def init_main(self):
14 toolbar = tk.Frame(bg='#d7d8e0', bd=2)
15 toolbar.pack(side=tk.TOP, fill=tk.X)
16
17 self.add_img = tk.PhotoImage(file='add-user.png')
18 btn_open_dialog = tk.Button(toolbar, text='Добавить ребёнка', command=self.open_dialog, bg='#d7d8e0', bd=0,
19 compound=tk.TOP, image=self.add_img)
20 btn_open_dialog.pack(side=tk.LEFT)
21
22 self.update_img = tk.PhotoImage(file='update-user.png')
23 btn_edit_dialog = tk.Button(toolbar, text='Редактировать', bg='#d7d8e0', bd=0, image=self.update_img,
24 compound=tk.TOP, command=self.open_update_dialog)
25 btn_edit_dialog.pack(side=tk.LEFT)
26
27 self.delete_img = tk.PhotoImage(file='delete-user.png')
28 btn_delete = tk.Button(toolbar, text='Удалить ребёнка', bg='#d7d8e0', bd=0, image=self.delete_img,
29 compound=tk.TOP, command=self.delete_records)
30 btn_delete.pack(side=tk.LEFT)
31
32 self.search_img = tk.PhotoImage(file='search-user.png')
33 btn_search = tk.Button(toolbar, text='Поиск', bg='#d7d8e0', bd=0, image=self.search_img,
34 compound=tk.TOP, command=self.open_search_dialog)
35 btn_search.pack(side=tk.LEFT)
36
37 self.refresh_img = tk.PhotoImage(file='refresh-user.png')
38 btn_refresh = tk.Button(toolbar, text='Обновить', bg='#d7d8e0', bd=0, image=self.refresh_img,
39 compound=tk.TOP, command=self.view_records)
40 btn_refresh.pack(side=tk.LEFT)
41
42 self.tree = ttk.Treeview(self, columns=('ID', 'description', 'costs', 'kruzhok', 'total', 'FIO_mami', 'FIO_papi'), height=15, show='headings')
43
44 self.tree.column('ID', width=30, anchor=tk.CENTER)
45 self.tree.column('description', width=275, anchor=tk.CENTER)
46 self.tree.column('costs', width=100, anchor=tk.CENTER)
47 self.tree.column('kruzhok', width=100, anchor=tk.CENTER)
48 self.tree.column('total', width=150, anchor=tk.CENTER)
49 self.tree.column('FIO_mami', width=275, anchor=tk.CENTER)
50 self.tree.column('FIO_papi', width=275, anchor=tk.CENTER)
51
52 self.tree.heading('ID', text='ID')
53 self.tree.heading('description', text='ФИО')
54 self.tree.heading('costs', text='Группа')
55 self.tree.heading('kruzhok', text='Кружок')
56 self.tree.heading('total', text='Сотовый номер')
57 self.tree.heading('FIO_mami', text='ФИО мамы')
58 self.tree.heading('FIO_papi', text='ФИО папы')
59
60 self.tree.pack(side=tk.LEFT)
61
62 scroll = tk.Scrollbar(self, command=self.tree.yview)
63 scroll.pack(side=tk.LEFT, fill=tk.Y)
64 self.tree.configure(yscrollcommand=scroll.set)
65
66 def records(self, description, costs, total, kruzhok, FIO_mami, FIO_papi):
67 self.db.insert_data(description, costs, total, kruzhok, FIO_mami, FIO_papi)
68 self.view_records()
69
70 def update_record(self, description, costs, total, kruzhok, FIO_mami, FIO_papi):
71 self.db.c.execute('''UPDATE finance SET description=?, costs=?, total=?, kruzhok=?, FIO_mami?, FIO_papi? WHERE ID=?''',
72 (description, costs, total, self.tree.set(self.tree.selection()[0], '#1', kruzhok, FIO_mami, FIO_papi)))
73 self.db.conn.commit()
74 self.view_records()
75
76 def view_records(self):
77 self.db.c.execute('''SELECT * FROM finance''')
78 [self.tree.delete(i) for i in self.tree.get_children()]
79 [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
80
81 def delete_records(self):
82 for selection_item in self.tree.selection():
83 self.db.c.execute('''DELETE FROM finance WHERE id=?''', (self.tree.set(selection_item, '#1'),))
84 self.db.conn.commit()
85 self.view_records()
86
87 def search_records(self, description):
88 description = ('%' + description + '%',)
89 self.db.c.execute('''SELECT * FROM finance WHERE description LIKE ?''', description)
90 [self.tree.delete(i) for i in self.tree.get_children()]
91 [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
92
93 def open_dialog(self):
94 Child()
95
96 def open_update_dialog(self):
97 Update()
98
99 def open_search_dialog(self):
100 Search()
101
102
103class Child(tk.Toplevel):
104 def __init__(self):
105 super().__init__(root)
106 self.init_child()
107 self.view = app
108
109 def init_child(self):
110 self.title('Добавить ребёнка')
111 self.geometry('400x300+400+300')
112 self.resizable(False, False)
113
114 label_description = tk.Label(self, text='ФИО:')
115 label_description.place(x=50, y=50)
116 label_select = tk.Label(self, text='Группа:')
117 label_select.place(x=50, y=80)
118 label_sum = tk.Label(self, text='Сотовый номер:')
119 label_sum.place(x=50, y=140)
120 label_kruzhok = tk.Label(self, text='Кружок:')
121 label_kruzhok.place(x=50, y=110)
122 label_FIO_mami = tk.Label(self, text='ФИО мамы:')
123 label_FIO_mami.place(x=50, y=170)
124 label_FIO_papi = tk.Label(self, text='ФИО папы:')
125 label_FIO_papi.place(x=50, y=200)
126
127 self.entry_description = ttk.Entry(self)
128 self.entry_description.place(x=200, y=50)
129
130 self.entry_money = ttk.Entry(self)
131 self.entry_money.place(x=200, y=110)
132
133 self.combobox = ttk.Combobox(self, values=[u'Ромашка', u'Солнышко'])
134 self.combobox.current(0)
135 self.combobox.place(x=200, y=80)
136
137 self.entry_kruzhok = ttk.Entry(self)
138 self.entry_kruzhok.place(x=200, y=140)
139
140 self.entry_FIO_mami = ttk.Entry(self)
141 self.entry_FIO_mami.place(x=200, y=170)
142
143 self.entry_FIO_papi = ttk.Entry(self)
144 self.entry_FIO_papi.place(x=200, y=200)
145
146 btn_cancel = ttk.Button(self, text='Закрыть', command=self.destroy)
147 btn_cancel.place(x=300, y=230)
148
149 self.btn_ok = ttk.Button(self, text='Добавить')
150 self.btn_ok.place(x=220, y=230)
151 self.btn_ok.bind('<Button-1>', lambda event: self.view.records(self.entry_description.get(),
152 self.combobox.get(),
153 self.entry_money.get(),
154 self.entry_kruzhok.get(),
155 self.entry_FIO_mami.get(),
156 self.entry_FIO_papi.get()))
157
158 self.grab_set()
159 self.focus_set()
160
161
162class Update(Child):
163 def __init__(self):
164 super().__init__()
165 self.init_edit()
166 self.view = app
167 self.db = db
168 self.default_data()
169
170 def init_edit(self):
171 self.title('Редактировать ребёнка')
172 btn_edit = ttk.Button(self, text='Редактировать')
173 btn_edit.place(x=205, y=230)
174 btn_edit.bind('<Button-1>', lambda event: self.view.update_record(self.entry_description.get(),
175 self.combobox.get(),
176 self.entry_money.get(),
177 self.entry_kruzhok.get(),
178 self.entry_FIO_mami.get(),
179 self.entry_FIO_papi.get()))
180
181 self.btn_ok.destroy()
182
183 def default_data(self):
184 self.db.c.execute('''SELECT * FROM finance WHERE id=?''',
185 (self.view.tree.set(self.view.tree.selection()[0], '#1'),))
186 row = self.db.c.fetchone()
187 self.entry_description.insert(0, row[1])
188 if row[2] != 'Ромашка':
189 self.combobox.current(1)
190 self.entry_money.insert(0, row[3])
191 self.entry_kruzhok.insert(0, row[4])
192 self.entry_FIO_mami.insert(0, row[5])
193 self.entry_FIO_papi.insert(0, row[6])
194
195
196class Search(tk.Toplevel):
197 def __init__(self):
198 super().__init__()
199 self.init_search()
200 self.view = app
201
202 def init_search(self):
203 self.title('Поиск')
204 self.geometry('300x100+400+300')
205 self.resizable(False, False)
206
207 label_search = tk.Label(self, text='Поиск')
208 label_search.place(x=50, y=20)
209
210 self.entry_search = ttk.Entry(self)
211 self.entry_search.place(x=105, y=20, width=150)
212
213 btn_cancel = ttk.Button(self, text='Закрыть', command=self.destroy)
214 btn_cancel.place(x=185, y=50)
215
216 btn_search = ttk.Button(self, text='Поиск')
217 btn_search.place(x=105, y=50)
218 btn_search.bind('<Button-1>', lambda event: self.view.search_records(self.entry_search.get()))
219 btn_search.bind('<Button-1>', lambda event: self.destroy(), add='+')
220
221
222class DB:
223 def __init__(self):
224 self.conn = sqlite3.connect('finance.db')
225 self.c = self.conn.cursor()
226 self.c.execute(
227 '''CREATE TABLE IF NOT EXISTS finance (id integer primary key, description text, costs text, total integer, kruzhok text, FIO_mami text, FIO_papi text)''')
228 self.conn.commit()
229
230 def insert_data(self, description, costs, total, kruzhok, FIO_mami, FIO_papi):
231 self.c.execute('''INSERT INTO finance(description, costs, total, kruzhok, FIO_mami, FIO_papi) VALUES (?, ?, ?, ?, ?, ?)''',
232 (description, costs, total, kruzhok, FIO_mami, FIO_papi))
233 self.conn.commit()
234
235
236if __name__ == "__main__":
237 root = tk.Tk()
238 db = DB()
239 app = Main(root)
240 app.pack()
241 root.title("Детский сад")
242 root.geometry("1350x450+300+200")
243 root.resizable(False, False)
244 root.mainloop()