Работаю с учетом сотрудников, python, tkinter, не могу добавить еще одно поле поиск

import tkinter as tk
import sqlite3
from tkinter import ttk
import os

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='#d7d8e0', bd=2)
        toolbar.pack(side=tk.TOP, fill=tk.X)

        self.one_image = tk.PhotoImage(file='учёт/img/1.png')
        btn_one = tk.Button(toolbar, image=self.one_image,
                               bg='#d7d8e0', bd=0)
        btn_one.pack(side=tk.LEFT)
        
        self.add_image = tk.PhotoImage(file='учёт/img/add.png')
        btn_open_dialog = tk.Button(toolbar, image=self.add_image,
                                    bg='#d7d8e0', bd=0, command=self.open_dialog)
        btn_open_dialog.pack(side=tk.LEFT)
        
        self.update_image = tk.PhotoImage(file='учёт/img/update.png')
        btn_update = tk.Button(toolbar, image=self.update_image,
                                    bg='#d7d8e0', bd=0, command=self.update_dialog)
        btn_update.pack(side=tk.LEFT)

        self.delete_image = tk.PhotoImage(file='учёт/img/delete.png')
        btn_delete = tk.Button(toolbar, image=self.delete_image,
                                    bg='#d7d8e0', bd=0, command=self.delete_records)
        btn_delete.pack(side=tk.LEFT)
        
        self.search_image = tk.PhotoImage(file='учёт/img/search.png')
        btn_search = tk.Button(toolbar, image=self.search_image,
                               bg='#d7d8e0', bd=0, command=self.search_dialog)
        btn_search.pack(side=tk.LEFT)
        
        self.refresh_image = tk.PhotoImage(file='учёт/img/refresh.png')
        btn_refresh = tk.Button(toolbar, image=self.refresh_image,
                                    bg='#d7d8e0', bd=0, command=self.view_records)
        btn_refresh.pack(side=tk.LEFT)

        self.exit = tk.PhotoImage(file='учёт/img/3.png')
        btn_exit = tk.Button(toolbar, image=self.exit,
        bg='#d7d8e0', bd=0, command=lambda: [root.destroy(), os.startfile("C:\\Users\\New\\Desktop\\DIPLOM\\dialog\\build3\\gui.py")])
        btn_exit.pack(side=tk.LEFT)
        

        
        self.tree = ttk.Treeview(self, columns=['ID', 'name', 'Ученое_звание', 'Кафедра', 'authorid'],
                                 height=45, show='headings')
        self.tree.column('ID', width=30, anchor=tk.CENTER)
        self.tree.column('name', width=200, anchor=tk.CENTER)
        self.tree.column('Ученое_звание', width=150, anchor=tk.CENTER)
        self.tree.column('Кафедра', width=100, anchor=tk.CENTER)
        self.tree.column('authorid', width=70, anchor=tk.CENTER)
        
        self.tree.heading('ID', text='ID')
        self.tree.heading('name', text='ФИО')
        self.tree.heading('Ученое_звание', text='Ученое звание')
        self.tree.heading('Кафедра', text='Кафедра')
        self.tree.heading('authorid', text='authorid')

        self.tree.pack(side=tk.LEFT)
        
    def open_dialog(self):
        Child()
        
    def update_dialog(self):
        Update()
    
    def search_dialog(self):
        Search()
        
    def records(self, name, Ученое_звание, Кафедра, authorid):
        self.db.insert_data(name, Ученое_звание, Кафедра, authorid)
        self.view_records()
        
    def view_records(self):
        self.db.c.execute("""SELECT * FROM db""")
        [self.tree.delete(i) for i in self.tree.get_children()]
        [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
        
    def update_record(self, name, ученое_звание, кафедра, authorid):
        self.db.c.execute("""
        UPDATE db SET name=?, Ученое_звание=?, Кафедра=?, authorid=? WHERE ID=?""",
        (name, ученое_звание, кафедра, authorid, 
        self.tree.set(self.tree.selection()[0], '#1')))
        self.view_records()
        
    def delete_records(self):
        for selection_item in self.tree.selection():
            self.db.c.execute("DELETE FROM db WHERE id=?",
                              (self.tree.set(selection_item, '#1')))
        self.db.conn.commit()
        self.view_records()
        
    def search_records(self, name):
        name = ('%' + name + '%')
        self.db.c.execute("""
        SELECT * FROM db 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.c.fetchall()]


class Child(tk.Toplevel):
    def __init__(self):
        super().__init__(root)
        self.init_child()
        self.view = app
        
    def init_child(self):
        self.title('Добавить')
        self.geometry('400x220')
        self.resizable(False, False)
        
        self.grab_set()
        self.focus_set()
        
        label_name = tk.Label(self, text='ФИО')
        label_name.place(x=50, y=50)
        label_Ученое_звание = tk.Label(self, text='Ученое звание')
        label_Ученое_звание.place(x=50, y=80)
        label_Кафедра = tk.Label(self, text='Кафедра')
        label_Кафедра.place(x=50, y=110)
        label_authorid = tk.Label(self, text='authorid')
        label_authorid.place(x=50, y=140)
        
        self.entry_name = tk.Entry(self)
        self.entry_name.place(x=180, y=50)
        self.entry_Ученое_звание = tk.Entry(self)
        self.entry_Ученое_звание.place(x=180, y=80)
        self.entry_Кафедра = tk.Entry(self)
        self.entry_Кафедра.place(x=180, y=110)
        self.entry_authorid = tk.Entry(self)
        self.entry_authorid.place(x=180, y=140)
        
        self.btn_cancel = tk.Button(self, text='Закрыть', command=self.destroy)
        self.btn_cancel.place(x=250, y=180)
        
        self.btn_ok = tk.Button(self, text='Добавить')
        self.btn_ok.place(x=170, y=180)
        self.btn_ok.bind('<Button-1>', lambda event: self.view.records(self.entry_name.get(),
                                                                       self.entry_Ученое_звание.get(),
                                                                       self.entry_Кафедра.get(),
                                                                       self.entry_authorid.get()))


class Update(Child):
    def __init__(self):
        super().__init__()
        self.init_edit()
        self.view = app
        self.db = db
        self.deffault_data()
        
    def init_edit(self):
        self.title('Редактировать')
        btn_edit = tk.Button(self, text='Редактировать')
        btn_edit.place(x=140, y=180)
        btn_edit.bind('<Button-1>', lambda event: self.view.update_record(self.entry_name.get(),
                                                                          self.entry_Ученое_звание.get(),
                                                                          self.entry_Кафедра.get(),
                                                                          self.entry_authorid.get()))
        btn_edit.bind('<Button-1>', lambda event: self.destroy, add='+')
        self.btn_ok.destroy()

    
        
    def deffault_data(self):
        self.db.c.execute("""
        SELECT * FROM db WHERE ID=?""",
        (self.view.tree.set(self.view.tree.selection()[0], '#1'),))
        row = self.db.c.fetchone()
        self.entry_name.insert(0, row[1])
        self.entry_Ученое_звание.insert(0, row[2])
        self.entry_Кафедра.insert(0, row[3])
        self.entry_authorid.insert(0, row[4])


class Search(tk.Toplevel):
    def __init__(self):
        super().__init__(root)
        self.init_search()
        self.view = app

    def init_search(self):
        self.title('Поиск')
        self.geometry('300x100')
        self.resizable(False, False)
        
        label_search = tk.Label(self, text='Поиск по ФИО')
        label_search.place(x=50, y=20)
        
        self.search_entry = ttk.Entry(self)
        self.search_entry.place(x=145, y=20, width=150)
        
        self.btn_cancel = tk.Button(self, text='Закрыть', command=self.destroy)
        self.btn_cancel.place(x=185, y=50)
        
        btn_search = ttk.Button(self, text='Поиск')
        btn_search.place(x=100, y=50)
        btn_search.bind('<Button-1>', lambda event: 
            self.view.search_records(self.search_entry.get()))
        btn_search.bind('<Button-1>', lambda event:
            self.destroy, add='+')


        

class DB:
    def __init__(self):
        self.conn = sqlite3.connect('C:\\Users\\New\\Desktop\\DIPLOM\\db.db')
        self.c = self.conn.cursor()
        self.c.execute("""
        CREATE TABLE IF NOT EXISTS db(
            id INTEGER PRIMARY KEY,
            name TEXT,
            Ученое_звание TEXT,
            Кафедра TEXT,
            authorid TEXT)""")
        self.conn.commit()

    def insert_data(self, name, Ученое_звание, Кафедра, authorid):
        self.c.execute("""
        INSERT INTO db(name, Ученое_звание, Кафедра, authorid) VALUES (?, ?, ?, ?)""",
                                            (name, Ученое_звание, Кафедра, authorid,))
        self.conn.commit()


if __name__ == '__main__':
    root = tk.Tk()
    db = DB()
    app = Main(root)
    app.pack()
    root.title('Список сотрудников')
    root.geometry('700x500')
    root.resizable(False, False)
    root.mainloop()

Этот исходник работает, всё отлично, но диалоговое окно "Поиск" рассчитано только на поиск по ФИО, я пытался добавить второе поле (entry) и к нему привязать поиск по кафедрам. Но ничего не выходило:

def init_search(self):
    self.title('Поиск')
    self.geometry('300x100')
    self.resizable(False, False)

    label_search = tk.Label(self, text='Поиск по ФИО и Кафедре')
    label_search.place(x=50, y=20)

    self.search_entry_name = ttk.Entry(self)  # Поле для поиска по ФИО
    self.search_entry_name.place(x=105, y=20, width=150)

    self.search_entry_department = ttk.Entry(self)  # Поле для поиска по Кафедре
    self.search_entry_department.place(x=105, y=50, width=150)

    self.btn_cancel = tk.Button(self, text='Закрыть', command=self.destroy)
    self.btn_cancel.place(x=185, y=80)

    btn_search = ttk.Button(self, text='Поиск')
    btn_search.place(x=100, y=80)
    btn_search.bind('<Button-1>', self.search_records)
    btn_search.bind('<Button-1>', lambda event: self.destroy(), add='+')

Далее добавил в поиск по БД кафедру

def search_records(self, name, кафедра):
    name = '%' + name + '%'
    department = '%' + кафедра+ '%'
    self.db.c.execute("""
    SELECT * FROM db WHERE name LIKE ? OR Кафедра LIKE ? """, (name, кафедра,))
    [self.tree.delete(i) for i in self.tree.get_children()]
    [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]

Постоянно выходила ошибка: AttributeError: 'Search' object has no attribute 'search_records' Решил попробовать ее исправить так:

class Search(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.init_search()

    def init_search(self):
        self.title('Поиск')
        self.geometry('300x100')
        self.resizable(False, False)

        label_search = tk.Label(self, text='Поиск по ФИО и Кафедре')
        label_search.place(x=50, y=20)

        self.search_entry_name = ttk.Entry(self)  # Поле для поиска по ФИО
        self.search_entry_name.place(x=105, y=20, width=150)

        self.search_entry_department = ttk.Entry(self)  # Поле для поиска по Кафедре
        self.search_entry_department.place(x=105, y=50, width=150)

        self.btn_cancel = tk.Button(self, text='Закрыть', command=self.destroy)
        self.btn_cancel.place(x=185, y=80)

        btn_search = ttk.Button(self, text='Поиск')
        btn_search.place(x=100, y=80)
        btn_search.bind('<Button-1>', self.search)  # привязка к методу search и необходимо определить search

    def search(self, event=None):
        name = self.search_entry_name.get()
        department = self.search_entry_department.get()
        # Дальнейшие действия с полученными значениями

        self.destroy()  # закрываем окно поиска

Но поиск вообще перестал работать xD


Ответы (1 шт):

Автор решения: Migika sss

Сделал сам! btn_search.bind('', lambda event: self.view.search_records(self.search_entry.get(), self.department_entry.get())) важным моментом это было, привязка к кнопке

→ Ссылка