import tkinter as tk
from tkinter import ttk
import sqlite3
# Главное окно
class Main(tk.Frame):
def __init__(self, root):
super().__init__(root)
self.init_main()
self.db = db
self.view_records()
###################################################################################
# Хранение и создание виджетов
def init_main(self):
# Создание области кнопок
toolbar = tk.Frame(bg='#d7d7d7', bd=2)
toolbar.pack(side=tk.TOP, fill=tk.X)
# Добавить
self.add_img = tk.PhotoImage(file='./img/add.png')
btn_add = tk.Button(toolbar, bg='#d7d7d7', bd=0,
image=self.add_img, command=self.open_child)
btn_add.pack(side=tk.LEFT)
# Обновить
self.upd_img = tk.PhotoImage(file='./img/update.png')
btn_upd = tk.Button(toolbar, bg='#d7d7d7', bd=0,
image=self.upd_img, command=self.open_update_child)
btn_upd.pack(side=tk.LEFT)
# Удалить
self.del_img = tk.PhotoImage(file='./img/delete.png')
btn_del = tk.Button(toolbar, bg='#d7d7d7', bd=0,
image=self.del_img, command=self.delete_records)
btn_del.pack(side=tk.LEFT)
# Поиск
self.search_img = tk.PhotoImage(file='./img/search.png')
btn_search = tk.Button(toolbar, bg='#d7d7d7', bd=0,
image=self.search_img, command=self.open_search)
btn_search.pack(side=tk.LEFT)
# Обновление
self.refresh_img = tk.PhotoImage(file='./img/refresh.png')
btn_refresh = tk.Button(toolbar, bg='#d7d7d7', bd=0,
image=self.refresh_img, command=self.view_records)
btn_refresh.pack(side=tk.LEFT)
##############################################################################################
# Создание таблицы
self.tree=ttk.Treeview(self, columns=('id', 'name', 'phone', 'email', 'salary'),
height=45, show='headings')
# Добавление параметров колонкам
self.tree.column('id', width=35, anchor=tk.CENTER)
self.tree.column('name', width=200, anchor=tk.CENTER)
self.tree.column('phone', width=125, anchor=tk.CENTER)
self.tree.column('email', width=140, anchor=tk.CENTER)
self.tree.column('salary', width=110, anchor=tk.CENTER)
# Подписи колонок
self.tree.heading('id', text='ID')
self.tree.heading('name', text='ФИО')
self.tree.heading('phone', text='Телефон')
self.tree.heading('email', text='E_mail')
self.tree.heading('salary', text='Salary')
# Упаковка
self.tree.pack(side=tk.LEFT)
# Ползунок
scroll = tk.Scrollbar(self, command=self.tree.yview)
scroll.pack(side=tk.LEFT, fill=tk.Y)
self.tree.configure(yscrollcommand=scroll.set)
#################################################################################################
# Метод для записи данных
def records(self, name, phone, email, salary):
self.db.insert_data(name, phone, email, salary)
self.view_records()
# Метод для отображения данных
def view_records(self):
self.db.cur.execute("""SELECT * FROM users""")
# Удалить всё из виджета
[self.tree.delete(i) for i in self.tree.get_children()]
# Добавляем в таблицу все данные из бд
[self.tree.insert('', 'end', values=row)
for row in self.db.cur.fetchall()]
# Метод обновления данных
def update_record(self, name, phone, email, salary):
id = self.tree.set(self.tree.selection()[0], '#1')
self.db.cur.execute('''UPDATE users SET name=?, phone=?, email=?, salary=? WHERE id=?''',
(name, phone, email, salary, id))
self.db.conn.commit()
self.view_records()
# Метод удаления данных
def delete_records(self):
for row in self.tree.selection():
self.db.cur.execute('''DELETE FROM users WHERE id=?''',
(self.tree.set(row, '#1'),))
self.db.conn.commit()
self.view_records()
# Метод поиска по ФИО
def search_records(self, name):
name = ('%' + name + '%')
self.db.cur.execute('''SELECT * FROM users WHERE name LIKE ?''', (name, ))
[self.tree.delete(i) for i in self.tree.get_children()]
[self.tree.insert('', 'end', values=row)
for row in self.db.cur.fetchall()]
###########################################################################################
# Метод, отвечающий за вызов окна добавления
def open_child(self):
Child()
# Метод, отвечающий за вызов окна обновления
def open_update_child(self):
Update()
# Метод, отвечающий за вызов окна Поиска
def open_search(self):
Search()
###############################################################################################
###############################################################################################
###############################################################################################
# Окно добавления данных
class Child(tk.Toplevel):
def __init__(self):
super().__init__(root)
self.init_child()
self.view = app
def init_child(self):
self.title('Добавить')
self.geometry("400x250")
root.resizable(False, False)
# Перехватить все события, происходящие в приложении
self.grab_set()
# Захватить фокус
self.focus_set()
#######################################################################################
# Подписи
label_name = tk.Label(self, text='ФИО: ')
label_name.place(x=50, y=50)
label_phone = tk.Label(self, text='Телефон: ')
label_phone.place(x=50, y=80)
label_email = tk.Label(self, text='E-mail: ')
label_email.place(x=50, y=110)
label_salary = tk.Label(self, text='Зар.плата: ')
label_salary.place(x=50, y=140)
self.entry_name = ttk.Entry(self)
self.entry_name.place(x=200, y=50)
self.entry_phone = ttk.Entry(self)
self.entry_phone.place(x=200, y=80)
self.entry_email = ttk.Entry(self)
self.entry_email.place(x=200, y=110)
self.entry_salary = ttk.Entry(self)
self.entry_salary.place(x=200, y=140)
######################################################################################################
# Кнопка закрытия
self.btn_cancel = ttk.Button(self, text='Закрыть', command=self.destroy)
self.btn_cancel.place(x=300, y=170)
# Кнопка добавления
self.btn_add = ttk.Button(self, text='Добавить')
self.btn_add.place(x=220, y=170)
self.btn_add.bind('<Button-1>', lambda event:
self.view.records(self.entry_name.get(),
self.entry_phone.get(),
self.entry_email.get(),
self.entry_salary.get()))
# Окно изменения ланных
class Update(Child):
def __init__(self):
super().__init__()
self.init_edit()
self.view = app
self.db = db
self.default_data()
def init_edit(self):
self.title('Редактировать позицию')
self.btn_add.destroy()
self.btn_upd = ttk.Button(self, text='Редактировать')
self.btn_upd.bind('<Button-1>', lambda event:
self.view.update_record(self.entry_name.get(),
self.entry_phone.get(),
self.entry_email.get(),
self.entry_salary.get()))
self.btn_upd.bind('<Button-1>', lambda event: self.destroy(), add="+")
self.btn_upd.place(x=200, y=170)
# Подгрузка данных в форму
def default_data(self):
id = self.view.tree.set(self.view.tree.selection()[0], '#1')
self.db.cur.execute('''SELECT * FROM users WHERE id=?''', (id, ))
# Получаем доступ к первой записи из выборки
row = self.db.cur.fetchone()
self.entry_name.insert(0, row[1])
self.entry_phone.insert(0, row[2])
self.entry_email.insert(0, row[3])
self.entry_salary.insert(0, row[4])
################################################################################################
class Search(tk.Toplevel):
def __init__(self):
super().__init__(root)
self.init_child()
self.view = app
def init_child(self):
self.title("Поиск")
self.geometry('300x100')
self.resizable(False, False)
self.grab_set()
self.focus_set()
#####################################################################################################
label_name = tk.Label(self, text='ФИО: ')
label_name.place(x=20, y=20)
self.entry_name = tk.Entry(self)
self.entry_name.place(x=70, y=20)
#########################################################################################
self.btn_cancel = ttk.Button(self, text='Закрыть', command=self.destroy)
self.btn_cancel.place(x=200, y=70)
self.btn_search = ttk.Button(self, text="Найти")
self.btn_search.place(x=70, y=70)
self.btn_search.bind('<Button-1>', lambda event: self.view.search_records(self.entry_name.get()))
########################################################################################################
# Класс БД
class DB:
def __init__(self):
self.conn = sqlite3.connect('staff.db')
self.cur = self.conn.cursor()
self.cur.execute(
"""CREATE TABLE IF NOT EXISTS users(
id INTEGER PRIMARY KEY,
name TEXT,
phone TEXT,
email TEXT,
salary TEXT
)"""
)
self.conn.commit()
def insert_data(self, name, phone, email, salary):
self.cur.execute("""INSERT INTO users (name, phone, email, salary) VALUES(?, ?, ?, ?)""", (name, phone, email, salary))
self.conn.commit()
# Окошко
if __name__ == '__main__':
root = tk.Tk()
# Экземпляр класса DB
db= DB()
app = Main(root)
app.pack()
root.title('Список сотрудников компании') # Заголовок
root.geometry("665x450") # Размер окна
root.resizable(False, False) # Не даём открыть в полный экран и растягивать окно
root.configure(bg='White')
root.mainloop()