Форум сайта python.su
Всем доброе утро. Подскажет кто про tkinter - столкнулся со странным поведением фреймов.
Ниже - код основного окна:
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()
Отредактировано Niccolum (Ноя. 12, 2017 17:41:57)
Прикреплённый файлы: photo_2017-11-12_14-17-36.jpg (145,5 KБ)
Офлайн
.
Прикреплённый файлы: photo_2017-11-12_14-17-51.jpg (130,7 KБ)
Офлайн
Не соблюдение 3 правил из книги “Советы по питону”, иначе правилам PEP 8(“правильное неаписание кода”). Ничего не понятно. Хотя нет, даже 4-ех правил.
Еще кое-что:
NiccolumТы не должен так сильно ограничивать размеры окна. Если у пользователя еще какие-нибудь проги запущены, он их не увидит из-за твоего окна.
root.maxsize(width=1024, height=600)
root.minsize(width=1024, height=600)
Niccolum3 не соблюденное правило PEP 8:
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)
Отредактировано damilkrose (Ноя. 12, 2017 17:29:24)
Офлайн
Не соблюдение 3 правил из книги “Советы по питону”В процессе удобочитаемости, думаю, как это разнести по другим файлам + добавить удобочитаемость
Ты не должен так сильно ограничивать размеры окнаПочему? Я просто не хочу, чтобы у меня всё расплывалось или некорректно работал дизайн, если будут приложение увеличивать. Что посоветуешь, чтобы такого не было.
Отредактировано Niccolum (Ноя. 12, 2017 17:42:43)
Офлайн
NiccolumНе вижу особой проблемы, не знаю как ты.
В процессе удобочитаемости, думаю, как это разнести по другим файлам + добавить удобочитаемость
NiccolumЦеплять все лэйбелы на root.
Почему? Я просто не хочу, чтобы у меня всё расплывалось или некорректно работал дизайн, если будут приложение увеличивать. Что посоветуешь, чтобы такого не было.
NiccolumБыла такаяже ошибка. Надо юзать root.update()
И также не подскажешь, в чём всё таки может быть трабл? Пропадает верхний (в данный момент неактивный) фрейм при изменении другого фрема (изменении label)
Отредактировано damilkrose (Ноя. 12, 2017 19:02:32)
Офлайн