Tkinter, проверка заполненности полей Entry
Пишу программу на python для работы с БД(sqlite3), есть основное окно, куда выводятся данные из таблицы, дополнительное(Toplevel) окно для ввода новых данных. Перед добавлением новой строки в таблицу хочу проверять, что все поля в дополнительном окне заполнены. хочу, чтобы работало так:
- Открывается дополнительное окно, которое содержит поля для ввода и кнопку "Добавить"
- После нажатия на кнопку, если все поля заполнены, данные добавляются в БД
- Если хотя бы одно поле пустое, появляется окно с ошибкой: "Все поля должны быть заполнены"
- После закрытия окна с ошибкой должно остаться исходное окно с данными, которые пользователь вводил (если вводил хоть что-то) Пункт 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 не будут заполнены?