Tkinter, проверка заполненности полей Entry

Рейтинг: 0Ответов: 0Опубликовано: 05.05.2023

Пишу программу на python для работы с БД(sqlite3), есть основное окно, куда выводятся данные из таблицы, дополнительное(Toplevel) окно для ввода новых данных. Перед добавлением новой строки в таблицу хочу проверять, что все поля в дополнительном окне заполнены. хочу, чтобы работало так:

  1. Открывается дополнительное окно, которое содержит поля для ввода и кнопку "Добавить"
  2. После нажатия на кнопку, если все поля заполнены, данные добавляются в БД
  3. Если хотя бы одно поле пустое, появляется окно с ошибкой: "Все поля должны быть заполнены"
  4. После закрытия окна с ошибкой должно остаться исходное окно с данными, которые пользователь вводил (если вводил хоть что-то) Пункт 4 реализовать не получается
class View_Window():
    def __init__(self, master,filepath):

        self.master = master
        self.filepath = filepath
        self.window = Toplevel(master)
        self.window.title("Новое окно")
        self.window.geometry("550x320+400+200")
        self.window.resizable(False, False)
        self.window.focus_set()

        self.label1 = ttk.Label(self.window,text="Название книги")
        self.label1.grid(row=1, column=0, sticky="nsew")
        self.label2 = ttk.Label(self.window,text="Автор")
        self.label2.grid(row=2, column=0, sticky="nsew")
        self.label3 = ttk.Label(self.window,text="Год")
        self.label3.grid(row=3, column=0, sticky="nsew")
        self.label4 = ttk.Label(self.window,text="ФИО студента")
        self.label4.grid(row=4, column=0, sticky="nsew")
        self.label5 = ttk.Label(self.window,text="Группа")
        self.label5.grid(row=5, column=0, sticky="nsew")
        self.label6 = ttk.Label(self.window,text="Телефон")
        self.label6.grid(row=6, column=0, sticky="nsew")
        self.label7 = ttk.Label(self.window,text="Эл.почта")
        self.label7.grid(row=7, column=0, sticky="nsew")
        self.label8 = ttk.Label(self.window,text="Статус")
        self.label8.grid(row=8, column=0, sticky="nsew")

        self.book = ttk.Entry(self.window)
        self.book.grid(row=1, column=1, columnspan = 3, sticky="nsew", ipadx=100, ipady=1, padx=4, pady=4)
        self.author = ttk.Entry(self.window)
        self.author.grid(row=2, column=1, columnspan = 3, sticky="nsew" ,ipadx=100, ipady=1, padx=4, pady=4)
        self.year = ttk.Entry(self.window)
        self.year.grid(row=3, column=1, columnspan = 3, sticky="nsew", ipadx=100, ipady=1, padx=4, pady=4)
        self.fio = ttk.Entry(self.window)
        self.fio.grid(row=4, column=1, columnspan = 3, sticky="nsew", ipadx=100, ipady=1, padx=4, pady=4)
        self.group = ttk.Entry(self.window)
        self.group.grid(row=5, column=1, columnspan = 3, sticky="nsew", ipadx=100, ipady=1, padx=4, pady=4)
        self.telnum = ttk.Entry(self.window)
        self.telnum.grid(row=6, column=1, columnspan = 3, sticky="nsew", ipadx=100, ipady=1, padx=4, pady=4)
        self.email = ttk.Entry(self.window)
        self.email.grid(row=7, column=1, columnspan = 3, sticky="nsew", ipadx=100, ipady=1, padx=4, pady=4)
        self.status = ttk.Entry(self.window)
        self.status.grid(row=8, column=1, columnspan = 3, sticky="nsew", ipadx=100, ipady=1, padx=4, pady=4)

        self.btn = ttk.Button(self.window, text='Ввести', command = self.command)
        self.btn.grid(row=10, column=2, sticky="nsew", ipadx=1, ipady=1, padx=4, pady=4)
        self.btn = ttk.Button(self.window, text='Отмена', command = self.window.destroy)
        self.btn.grid(row=11, column=2, sticky="nsew", ipadx=1, ipady=1, padx=4, pady=4)
        
    def add_user(self):

        self.book = self.book.get()
        self.author = self.author.get()
        self.year = self.year.get()
        self.fio = self.fio.get()
        self.group = self.group.get()
        self.telnum = self.telnum.get()
        self.email = self.email.get()
        self.status = self.status.get()
        a = [self.book, self.author, self.year, self.fio, self.group, self.telnum, self.email, self.status]
        
        if '' not in a:
            
            with Database(self.filepath) as db:
                db.execute('INSERT INTO biblioteka (book, author, year, fio, group_cod, telnum, email, status) VALUES (?,?,?,?,?,?,?,?)',
                           (self.book, self.author, self.year, self.fio, self.group, self.telnum, self.email, self.status))
                db.commit()
        else:
            
            showerror(parent=self.window, title="Ошибка!!!", message="Все поля должны быть заполнены")


    def command(self):

        self.add_user()
        self.window.destroy()

Я понимаю, что command(), которая привязана к кнопке, в любом случае вызовет закрытие дополнительного окна, я пробовала это исправить, но если дополнительное окно остается открытым после закрытия окна ошибки, это вызывает

AttributeError: 'str' object has no attribute 'get'

что тоже логично. Идей, как реализовать пункт 4, у меня просто уже нет Существует ли сценарий, при котором кнопка "Добавить" будет неактивна до того момента, пока все поля Entry не будут заполнены?

Ответы

Ответов пока нет.