Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 8, 2018 18:16:06

SadSa13
Зарегистрирован: 2018-11-30
Сообщения: 12
Репутация: +  0  -
Профиль  

Как скрыть фрейм? TK

Требуется скрыть или удалить фрейм со всем, что на нем при нажатии кнопки. Реализуемо?

Офлайн

#2 Дек. 8, 2018 18:17:11

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как скрыть фрейм? TK

SadSa13
Реализуемо?
Да. гуглите в сторону pack_forget и grid_forget .



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Дек. 8, 2018 18:28:03)

Офлайн

#3 Дек. 8, 2018 19:46:18

SadSa13
Зарегистрирован: 2018-11-30
Сообщения: 12
Репутация: +  0  -
Профиль  

Как скрыть фрейм? TK

PEHDOM
Пишу как раз после гугления. Все forget не работают с фреймами.

Офлайн

#4 Дек. 8, 2018 19:48:01

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как скрыть фрейм? TK

SadSa13 ну вы хоть код какойнить выложите, чтоле? чтобы понимать что на самом вы делаете.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Дек. 8, 2018 22:25:20

SadSa13
Зарегистрирован: 2018-11-30
Сообщения: 12
Репутация: +  0  -
Профиль  

Как скрыть фрейм? TK

PEHDOM
SadSa13 ну вы хоть код какойнить выложите, чтоле? чтобы понимать что на самом вы делаете.
 from tkinter import *
from tkinter import ttk
def event1(*event):
    #tpasswordfr.place_forget()
    tmenugr = ttk.Frame(root,width=320,height=700).place(x = 270,y = 700)
    tmenulb = ttk.Label(tmenugr,text='О нас:       ',font='arial 14').place(x = 550, y = 50)
def event2(*event):
   tpasswordfr = ttk.Frame(root,width=320,height=700).place(x = 270,y = 700)
   tmenulb = ttk.Label(tpasswordfr,text='Браузеры:',font='arial 14').place(x = 550, y = 50)
root = Tk()
root.title("Program")
root.geometry('1024x700')
mainfr = Frame(root,width=260,height=700, bg='#FFEFD5').place(x = 0,y = 0)
menufr= ttk.Frame(mainfr,width=200,height=40).place(x = 20,y = 100)
passwordfr = ttk.Frame(mainfr,width=200,height=40).place(x = 20,y = 150)
settingfr = ttk.Frame(mainfr,width=200,height=40).place(x = 20,y = 200)
menubtn = Button( menufr,text="Меню",width=30,height=2, command=event1, activebackground='#FF4500').place(x = 20,y = 100)
passwordbtn = Button( passwordfr,text="Пароли",width=30,height=2, command=event2, activebackground='#FF4500').place(x = 20,y = 150)
settingbtn = Button ( settingfr, text='Настройки',width=30,height=2, command=event1, activebackground='#FF4500').place(x = 20,y = 200)
root.mainloop()

Офлайн

#6 Дек. 9, 2018 10:25:02

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

Как скрыть фрейм? TK

1. Конструкция типа: переменная = виджет.place() не имеет смысла, так как переменная всегда будет None. Нужно использовать либо виджет.place() если мы не планируем изменять виджет, либо: переменная = виджет и переменная.place

 #если не нужна переменная пишем так:
Button(text="Пароли",width=30, height=2, command=event2, activebackground='#FF4500').place(x = 20,y = 150)
 
#если переменная нужна пишем так:
btn1 = Button(text="Пароли",width=30, height=2, command=event2, activebackground='#FF4500')
btn1.place(x = 20,y = 150)

2. Все ваши фреймы (кроме одного) существуют сами по себе, они невидимы, ни в чём не участвуют, а некоторые даже находятся за пределами главного окна. Если удалить эти фреймы и их переменные, никто не заметит пропажи.
Следующий код делает то же самое что и ваш, только без лишнего мусора:
 from tkinter import *
from tkinter import ttk
 
def event1():
    ttk.Label(text='О нас:       ',font='arial 14').place(x = 550, y = 50)
 
def event2():
    ttk.Label(text='Браузеры:',font='arial 14').place(x = 550, y = 50)
 
root = Tk()
root.title("Program")
root.geometry('1024x700')
Frame(root,width=260,height=700, bg='#FFEFD5').place(x = 0,y = 0)  #этот фрейм нужен для раскраски
Button(text="Меню",width=30,height=2, command=event1, activebackground='#FF4500').place(x = 20,y = 100)
Button(text="Пароли",width=30,height=2, command=event2, activebackground='#FF4500').place(x = 20,y = 150)
Button(text='Настройки',width=30,height=2, command=event1, activebackground='#FF4500').place(x = 20,y = 200)
root.mainloop()

Чтобы продолжить дальше, нужно знать почему вы хотите что-то удалить или скрыть, скорей всего проще и правильней будет поменять надпись в Label, чем пинать её ногами.

Офлайн

#7 Дек. 9, 2018 11:37:39

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как скрыть фрейм? TK

SadSa13 давайте я угадаю, оно вам говорит что “global name ‘tpasswordfr’ is not defined”?
Так это не forget не работают с фреймами, это вы не знаете разницу между глобальными и локальными переменными. Дальше будет еще веселее, оно будет сообщать вам что ‘NoneType’ object has no attribute ‘place_forget’. Это опять же не потому что “оно не работает”, а потому что вы не понимаете что делаете.
Вот так оно работает, хоть местами и неправильно:

 from tkinter import *
from tkinter import ttk
def event1(*event):
    tpasswordfr.place_forget()
    tmenugr.place(x = 270,y = 50)
    
def event2(*event):
    tmenugr.place_forget()
    tpasswordfr.place(x = 270,y = 50)
    
root = Tk()
root.title("Program")
root.geometry('1024x700')
mainfr = Frame(root,width=260,height=700, bg='#FFEFD5').place(x = 0,y = 0)
menufr= ttk.Frame(mainfr,width=200,height=40).place(x = 20,y = 100)
passwordfr = ttk.Frame(mainfr,width=200,height=40).place(x = 20,y = 150)
settingfr = ttk.Frame(mainfr,width=200,height=40).place(x = 20,y = 200)
menubtn = Button( menufr,text="Меню",width=30,height=2, command=event1, activebackground='#FF4500').place(x = 20,y = 100)
passwordbtn = Button( passwordfr,text="Пароли",width=30,height=2, command=event2, activebackground='#FF4500').place(x = 20,y = 150)
settingbtn = Button ( settingfr, text='Настройки',width=30,height=2, command=event1, activebackground='#FF4500').place(x = 20,y = 200)
tmenugr = ttk.Frame(root,width=320,height=700)
ttk.Label(tmenugr,text='О нас:       ',font='arial 14').place(x = 50, y = 50)
tpasswordfr = ttk.Frame(root,width=320,height=700)
ttk.Label(tpasswordfr,text='Браузеры:',font='arial 14').place(x = 50, y = 50)
root.mainloop()
теперь замечания вообще:
- названия переменных, используйте хотябы симывол “_” для разделения, например: main_fr, menu_fr, password_fr, menu_btn и тд. вместо mainfr, menufr и тд… оно же нечитаемо.
- названия процедур event1 и event2 неинформативны лучше заменить на menu_btn_pres, password_btn_press к примеру. Тогда сразу понятно что это за процедуры.
- консмтрукция типа “ mainfr = Frame(root ,width=260,height=700, bg='#FFEFD5').place(x = 0,y = 0)” вообще бессмыслена, так как в переменную mainfr вернется результат выполнения place() (тоесть None), вместо ссылки на виджет типа Frame. Вы ведь заметили что задаете абсолютные координанаты, вместо относительных к фреймам в которых должны находиться виджеты? Это именно потому что у вас первым аргументом везде None, вот оно все и херачит на окно верхнего уровня.
вот так оно работает правильно:
 from tkinter import *
from tkinter import ttk
def menu_btn_press(*event):
    t_password_fr.place_forget()
    t_menu_gr.place(x = 270,y = 50)
def password_btn_press(*event):
    t_menu_gr.place_forget()
    t_password_fr.place(x = 270,y = 50)
root = Tk()
root.title("Program")
root.geometry('1024x700')
main_fr = Frame(root,width=260,height=700, bg='#FFEFD5')
main_fr.place(x = 0,y = 0)
menu_fr= ttk.Frame(main_fr,width=200,height=40)
menu_fr.place(x = 20,y = 100)
password_fr = ttk.Frame(main_fr,width=200,height=40)
password_fr.place(x = 20,y = 150)
setting_fr = ttk.Frame(main_fr,width=200,height=40)
setting_fr.place(x = 20,y = 200)
menu_btn = Button(menu_fr,text="Меню",width=30,height=2, command=menu_btn_press, activebackground='#FF4500')
menu_btn.place(x=5, y=2)
password_btn = Button(password_fr,text="Пароли",width=30,height=2, command=password_btn_press, activebackground='#FF4500')
password_btn.place(x=5, y=2)
setting_btn = Button (setting_fr, text='Настройки',width=30,height=2, command=menu_btn_press, activebackground='#FF4500')
setting_btn.place(x=5, y=2)
t_password_fr = ttk.Frame(root, width=320,height=700)
ttk.Label(t_password_fr,text='Браузеры:',font='arial 14').place(x = 200, y = 50)
t_menu_gr = ttk.Frame(root,width=320,height=700)
ttk.Label(t_menu_gr,text='О нас:       ',font='arial 14').place(x = 200, y = 100)
root.mainloop()



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Дек. 9, 2018 11:43:07)

Офлайн

#8 Дек. 9, 2018 11:43:13

SadSa13
Зарегистрирован: 2018-11-30
Сообщения: 12
Репутация: +  0  -
Профиль  

Как скрыть фрейм? TK

rami
1. Конструкция типа: переменная = виджет.place() не имеет смысла, так как переменная всегда будет None. Нужно использовать либо виджет.place() если мы не планируем изменять виджет, либо: переменная = виджет и переменная.place
Идея то как раз в том, чтобы при переключении кнопки ( к примеру с “Меню” на “Пароли” фрейм со всей всем, что было на Меню ( все надписи и виджеты) вместе с фреймом исчезают и появляется новый фрейм с новыми виджетами.

Офлайн

#9 Дек. 9, 2018 11:45:47

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как скрыть фрейм? TK

SadSa13
Идея то как раз в том, чтобы при переключении кнопки ( к примеру с “Меню” на “Пароли” фрейм со всей всем, что было на Меню ( все надписи и виджеты) вместе с фреймом исчезают и появляется новый фрейм с новыми виджетами.
вам уже два раза сказали что коснтрукция не имеет смысла, и даже показали как нужно.
ЗЫ забейте на place(), осваивайте grid() оно более универсальное и гибкое.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Дек. 9, 2018 11:52:27)

Офлайн

#10 Дек. 9, 2018 12:33:33

SadSa13
Зарегистрирован: 2018-11-30
Сообщения: 12
Репутация: +  0  -
Профиль  

Как скрыть фрейм? TK

PEHDOM
вам уже два раза сказали что коснтрукция не имеет смысла, и даже показали как нужно.
ЗЫ забейте на place(), осваивайте grid() оно более универсальное и гибкое.
Отредактировано PEHDOM (сегодня 11:52:27)
Спасибо. Я вас понял.НО! Как-то же подобное должно работать, создают же люди менюшки. На счет .grid() я честно пытался, но главный вопрос в том, как и что создает сетку изначально?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version