Ниже - код основного окна:
from tkinter import * from PIL import Image, ImageTk import tkinter.ttk as ttk from postgres_turnovers.sqlturnover_nb import windowturnoversql #импортирование других окон в основное окно from postgres_filefinding.sqlfiles_nb import windowfilefindingsql#импортирование других окон в основное окно from postgres_stock.sqlstock_nb import windowstocksql#импортирование других окон в основное окно from postgres_reports.sqlreports_nb import windowreportssql from main_win.main_nb import windowmain from prodhub.prod_nb import windowprod from statistics.stat_nb import windowstat from other.other_nb import windowother from settings.sets_nb import windowsets root = Tk() root.geometry('1024x600+{}+{}'.format(int(root.winfo_screenwidth()/5), int(root.winfo_screenheight()/5))) root.title('Добро пожаловать в PH Support') root.maxsize(width=1024, height=600) root.minsize(width=1024, height=600) image = Image.open("icons/photo4.jpg") photo = ImageTk.PhotoImage(image) def main(): main_label = Label(root) #создание основного фрейма main_label.pack(side = "bottom", fill = "both", expand = "yes") nb = ttk.Notebook(main_label) #создание вкладок в основном окне ttk.Style().theme_use('winnative') nb.pack(fill='both', expand='yes') nbmain = windowmain(main_label, image=photo) #ссылка на другое окно, которое будет использоваться на основном в качестве вкладки nbprod = windowprod(main_label, image=photo) nbturnoversql = windowturnoversql(main_label, image=photo) nbfilefindingsql = windowfilefindingsql(main_label, image=photo) nbstocksql = windowstocksql(main_label, image=photo) nbreportssql = windowreportssql(main_label, image=photo) nbstat = windowstat(main_label, image=photo) nbother = windowother(main_label, image=photo) nbsett = windowsets(main_label, image=photo) nb.add(nbmain, text='Главное окно') #Добавление его в основное окно и использование в качестве вкладки nb.add(nbprod, text='Продхаб') nb.add(nbturnoversql, text='Обороты PostgreSQL') nb.add(nbfilefindingsql, text='Поиск файлов в PostgreSQL') nb.add(nbstocksql, text='Акции в PostgreSQL') nb.add(nbreportssql, text='Отчёты и мониторинг в PostgreSQL') nb.add(nbstat, text='Статистика') nb.add(nbother, text='Другое') nb.add(nbsett, text='Настройки') root.mainloop() if __name == 'main': main()
Ниже - код с главным окном (Да, сам знаю, что лучше потом запились копомпактнее):
from tkinter import * import psycopg2 import pickle import os def windowmain(root, image=None): nb = Label(root, image=image) nb.pack(side = "bottom", fill = "both", expand = "yes") sqldataframe = Frame(nb, height=20) #Создание фрейма с вводом данных и ниже - создание и размещение элементов в нём sqlnameserverlabel = Label(sqldataframe, text='Имя сервера') sqlnamedblabel = Label(sqldataframe, text='Имя базы данных') sqlnamelabel = Label(sqldataframe, text="Имя пользователя") sqlpasswordlabel = Label(sqldataframe, text='Пароль') sqlportlabel = Label(sqldataframe, text='Порт') sqlnameserverstr = Entry(sqldataframe,width=25,bd=3) sqlnamedbstr = Entry(sqldataframe,width=25,bd=3) sqlnamestr = Entry(sqldataframe,width=20,bd=3) sqlpasswordstr = Entry(sqldataframe,width=25,bd=3) sqlportstr = Entry(sqldataframe,width=5,bd=5) sqldatasettingsframe = Frame(nb, height=30) # создание 2 фрейма для размещения кнопок, ниже - функции для кнопок, их создание и связка def checkfunc(event): try: conn = psycopg2.connect(host=sqlnameserverstr.get(), dbname=sqlnamedbstr.get(), user=sqlnamestr.get(), password=sqlpasswordstr.get(), port=sqlportstr.get()) sqlstatussettingslabel.configure(text='Подключение успешно', fg='green') except psycopg2.OperationalError as e: print(e) sqlstatussettingslabel.configure(text=e, fg='red') def savesettings(event): with open (f'{os.getcwd()}\\settings\\data.pickle', 'wb') as w: pickle.dump(sqlnameserverstr.get(), w) pickle.dump(sqlnamedbstr.get(), w) pickle.dump(sqlnamestr.get(), w) pickle.dump(sqlpasswordstr.get(), w) pickle.dump(sqlportstr.get(), w) sqlstatussettingslabel.configure(text='Данные сохранены', fg='green') def loadsettings(event): try: with open (f'{os.getcwd()}\\settings\\data.pickle', 'rb') as r: sqlnameserverstr.delete(0) sqlnameserverstr.insert(0, pickle.load(r)) sqlnamedbstr.delete(0) sqlnamedbstr.insert(0, pickle.load(r)) sqlnamestr.delete(0) sqlnamestr.insert(0, pickle.load(r)) sqlpasswordstr.delete(0) sqlpasswordstr.insert(0, pickle.load(r)) sqlportstr.delete(0) sqlportstr.insert(0, pickle.load(r)) sqlstatussettingslabel.configure(text='Данные восстановлены', fg='green') except FileNotFoundError: sqlstatussettingslabel.configure(text='Файл с настройками не обнаружен') sqlchecksettingsbottom = Button(sqldatasettingsframe, text="Проверка подключения", height=2, bg="white") sqlstatussettingslabel = Label(sqldatasettingsframe, text='Неизвестно') sqlsavesettingsbottom = Button(sqldatasettingsframe, text="Сохранить настройки", height=2, bg="white") sqlloadsettingsbottom = Button(sqldatasettingsframe, text="Восстановить настройки", height=2, bg="white") sqldataframe.grid(row=0,column=0, columnspan=10) #размещение 2 фреймов в основном окне и элементов во фреймах sqldatasettingsframe.grid(row=1,column=0, columnspan=10) sqlnameserverlabel.pack(side='left') sqlnameserverstr.pack(side='left') sqlnamedblabel.pack(side='left') sqlnamedbstr.pack(side='left') sqlnamelabel.pack(side='left') sqlnamestr.pack(side='left') sqlpasswordlabel.pack(side='left') sqlpasswordstr.pack(side='left') sqlportlabel.pack(side='left') sqlportstr.pack(side='left') sqlchecksettingsbottom.grid(row=0,column=0) sqlstatussettingslabel.grid(row=0,column=1) sqlsavesettingsbottom.grid(row=0,column=2) sqlloadsettingsbottom.grid(row=0,column=3) sqlchecksettingsbottom.bind('<Button-1>', checkfunc) sqlsavesettingsbottom.bind('<Button-1>', savesettings) sqlloadsettingsbottom.bind('<Button-1>', loadsettings) return nb if __name == 'main': root = Tk() root.geometry('1024x600+{}+{}'.format(int(root.winfo_screenwidth()/5), int(root.winfo_screenheight()/5))) root.title('тест настройки') root.maxsize(width=1024, height=600) root.minsize(width=1024, height=600) windowmain(root) root.mainloop()
Так вот. В чём проблема. При нажатии 1 из 3 кнопок на вкладке, где участвует второй код - пропадает 1 из фреймов. Притом, что если выбрать другую вкладку и вернуться обратно на нужную - фрейм будет на месте, и пропадёт, если я нажму на другую кнопку, если на эту же - не пропадёт.
Подскажите, что я делаю не так? Ниже пришлю скрины