Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2017 13:25:37

Niccolum
Зарегистрирован: 2016-04-26
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter. Проблема с отображением

Всем доброе утро. Подскажет кто про 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()

Так вот. В чём проблема. При нажатии 1 из 3 кнопок на вкладке, где участвует второй код - пропадает 1 из фреймов. Притом, что если выбрать другую вкладку и вернуться обратно на нужную - фрейм будет на месте, и пропадёт, если я нажму на другую кнопку, если на эту же - не пропадёт.
Подскажите, что я делаю не так? Ниже пришлю скрины

Отредактировано Niccolum (Ноя. 12, 2017 17:41:57)

Прикреплённый файлы:
attachment photo_2017-11-12_14-17-36.jpg (145,5 KБ)

Офлайн

#2 Ноя. 12, 2017 13:26:21

Niccolum
Зарегистрирован: 2016-04-26
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter. Проблема с отображением

.

Прикреплённый файлы:
attachment photo_2017-11-12_14-17-51.jpg (130,7 KБ)

Офлайн

#3 Ноя. 12, 2017 17:18:39

damilkrose
Зарегистрирован: 2017-11-10
Сообщения: 18
Репутация: +  -1  -
Профиль   Отправить e-mail  

tkinter. Проблема с отображением

Не соблюдение 3 правил из книги “Советы по питону”, иначе правилам PEP 8(“правильное неаписание кода”). Ничего не понятно. Хотя нет, даже 4-ех правил.
Еще кое-что:

Niccolum
root.maxsize(width=1024, height=600)
root.minsize(width=1024, height=600)
Ты не должен так сильно ограничивать размеры окна. Если у пользователя еще какие-нибудь проги запущены, он их не увидит из-за твоего окна.

P.S. Ну прям реально:
1 не соблюденное правило PEP 8:
Длина строки(не читая табуляции) намного выше 80 символов. Превышение делает необходимым пролистовать твой код вправо. Исключение только текст с ссылками или текст, в котором перенос части текста на более низкую строку кода будет делать его менее читаемым(вместо “шласашапошоссе!”,
“шласашап”
“ошоссе”)

2 не соблюденное правило PEP 8:
Многократное повторение начала переменной в названии других(за исключением взаимодействия с самой переменной, типо:
date = date.date()
date = str(date.date())
Niccolum
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)
3 не соблюденное правило PEP 8:
Не поставлены пустые строка между строками(за исключением строк, которые были показаны как пример во 2-ом не соблюденном правиле.
P.S. за исключением взаимодействия с той строкой, типо:
date = date.date()
date = str(date.date())
# Пропущенная строка
print(date)

Отредактировано damilkrose (Ноя. 12, 2017 17:29:24)

Офлайн

#4 Ноя. 12, 2017 17:33:27

Niccolum
Зарегистрирован: 2016-04-26
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter. Проблема с отображением

Не соблюдение 3 правил из книги “Советы по питону”
В процессе удобочитаемости, думаю, как это разнести по другим файлам + добавить удобочитаемость
Ты не должен так сильно ограничивать размеры окна
Почему? Я просто не хочу, чтобы у меня всё расплывалось или некорректно работал дизайн, если будут приложение увеличивать. Что посоветуешь, чтобы такого не было.

И также не подскажешь, в чём всё таки может быть трабл? Пропадает верхний (в данный момент неактивный) фрейм при изменении другого фрема (изменении label)
Подредактировал предыдущий код для удобочитаемости

К сожалению пустые строки для разделения, которые я использую, в цитирование не показываются, и потому всё одной портянкой, что неудобно

Отредактировано Niccolum (Ноя. 12, 2017 17:42:43)

Офлайн

#5 Ноя. 12, 2017 19:00:47

damilkrose
Зарегистрирован: 2017-11-10
Сообщения: 18
Репутация: +  -1  -
Профиль   Отправить e-mail  

tkinter. Проблема с отображением

Niccolum
В процессе удобочитаемости, думаю, как это разнести по другим файлам + добавить удобочитаемость
Не вижу особой проблемы, не знаю как ты.

Niccolum
Почему? Я просто не хочу, чтобы у меня всё расплывалось или некорректно работал дизайн, если будут приложение увеличивать. Что посоветуешь, чтобы такого не было.
Цеплять все лэйбелы на root.

Niccolum
И также не подскажешь, в чём всё таки может быть трабл? Пропадает верхний (в данный момент неактивный) фрейм при изменении другого фрема (изменении label)
Была такаяже ошибка. Надо юзать root.update()

P. S. Если не поможет - пропакать все лэйбелы с двоих фреймов( label.pack() ) - они появятся, инфа сотка

Отредактировано damilkrose (Ноя. 12, 2017 19:02:32)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version