Как установить "фокус" дочернего окна над главным?
Пишу программу для работы с БД. Есть два класса: класс главного окна, с кнопкой открытия дочернего окна, и класс дочернего окна с остальным функционалом. Нужно сделать так, чтобы я мог взаимодействовать с главным окном после отработки дочернего окна. Т.е не мог закрыть главное окно, нажимать на его кнопки и т.д, пока открыто дочернее окно. Читал про .grab_set() .focus_set() и .wait_window() но принципа их взаимодействия с классами так и не понял. Заранее спасибо за ответы
from tkinter import *
from tkinter import messagebox
import psycopg2
is_conn = False
#Entry только чисел
class Lotfi(Entry):
def __init__(self, master=None, **kwargs):
self.var = StringVar()
Entry.__init__(self, master, textvariable=self.var, **kwargs)
self.old_value = ''
self.var.trace('w', self.check)
self.get, self.set = self.var.get, self.var.set
def check(self, *args):
if self.get().isdigit():
# the current value is only digits; allow this
self.old_value = self.get()
else:
# there's non-digit characters in the input; reject this
self.set(self.old_value)
class main:
def __init__(self, master):
self.master = master
self.master.title('Программа')
self.master.geometry('550x550+300+225')
self.master.resizable(True, False)
self.connection_button = Button(self.master, text='Подключение', command=lambda: child(self.master))
self.connection_button.grid(row=0, column=0, stick='we')
self.master.mainloop()
class child:
def __init__(self, master):
self.slave = Toplevel(master)
self.slave.title('Подключение к БД')
self.slave.geometry('250x250+300+225')
self.slave.resizable(False, False)
self.host_label = Label(self.slave, text='Host').grid(row=0, column=0, stick='w')
self.database_label = Label(self.slave, text='Database').grid(row=1, column=0, stick='w')
self.user_label = Label(self.slave, text='User').grid(row=2, column=0, stick='w')
self.password_label = Label(self.slave, text='Password').grid(row=3, column=0, stick='w')
self.port_label = Label(self.slave, text='Port').grid(row=4, column=0, stick='w')
self.host_en = Entry(self.slave, width=30)
self.host_en.grid(row=0, column=1)
self.database_en = Entry(self.slave, width=30)
self.database_en.grid(row=1, column=1)
self.user_en = Entry(self.slave, width=30)
self.user_en.grid(row=2, column=1)
self.password_en = Entry(self.slave, width=30, show='*')
self.password_en.grid(row=3, column=1)
self.port_en = Lotfi(self.slave, width=30)
self.port_en.grid(row=4, column=1)
self.bnt_conn = Button(self.slave, text='Подключение', command=self.connection_to_db).grid(row=5, column=0, columnspan=2,
pady=10)
def connection_to_db(self):
global is_conn
try:
conn = psycopg2.connect(
host=f"{self.host_en.get()}",
database=f"{self.database_en.get()}",
user=f"{self.user_en.get()}",
password=f"{self.password_en.get()}",
port=f"{int(self.port_en.get())}",
)
is_conn = True
c = conn.cursor()
if is_conn:
messagebox.showinfo(title='Успешно', message='Успешное подключение к БД')
except psycopg2.OperationalError:
messagebox.showerror(title='Ошибка', message=f'{psycopg2.OperationalError}')
self.host_en.delete(0, END)
self.database_en.delete(0, END)
self.user_en.delete(0, END)
self.password_en.delete(0, END)
self.port_en.delete(0, END)
if is_conn:
self.slave.destroy()
root = Tk()
main(root)