Найти - Пользователи
Полная версия: Как скрыть фрейм? TK
Начало » GUI » Как скрыть фрейм? TK
1 2
SadSa13
Требуется скрыть или удалить фрейм со всем, что на нем при нажатии кнопки. Реализуемо?
PEHDOM
SadSa13
Реализуемо?
Да. гуглите в сторону pack_forget и grid_forget .
SadSa13
PEHDOM
Пишу как раз после гугления. Все forget не работают с фреймами.
PEHDOM
SadSa13 ну вы хоть код какойнить выложите, чтоле? чтобы понимать что на самом вы делаете.
SadSa13
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()
rami
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, чем пинать её ногами.
PEHDOM
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()
SadSa13
rami
1. Конструкция типа: переменная = виджет.place() не имеет смысла, так как переменная всегда будет None. Нужно использовать либо виджет.place() если мы не планируем изменять виджет, либо: переменная = виджет и переменная.place
Идея то как раз в том, чтобы при переключении кнопки ( к примеру с “Меню” на “Пароли” фрейм со всей всем, что было на Меню ( все надписи и виджеты) вместе с фреймом исчезают и появляется новый фрейм с новыми виджетами.
PEHDOM
SadSa13
Идея то как раз в том, чтобы при переключении кнопки ( к примеру с “Меню” на “Пароли” фрейм со всей всем, что было на Меню ( все надписи и виджеты) вместе с фреймом исчезают и появляется новый фрейм с новыми виджетами.
вам уже два раза сказали что коснтрукция не имеет смысла, и даже показали как нужно.
ЗЫ забейте на place(), осваивайте grid() оно более универсальное и гибкое.
SadSa13
PEHDOM
вам уже два раза сказали что коснтрукция не имеет смысла, и даже показали как нужно.
ЗЫ забейте на place(), осваивайте grid() оно более универсальное и гибкое.
Отредактировано PEHDOM (сегодня 11:52:27)
Спасибо. Я вас понял.НО! Как-то же подобное должно работать, создают же люди менюшки. На счет .grid() я честно пытался, но главный вопрос в том, как и что создает сетку изначально?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB