При нажатии на кнопку для отображения скрытого фрейма отображается первоначальное окно, а поверх него новое. Как убрать первоначальное окно?
В программе калькулятор создаю два режима: базовый и расширенный.
При нажатии на кнопку ?
правее базового фрейма (self.frame_a
), должен появиться другой фрейм (self.frame_b
), который по умолчанию скрыт.
Всё получается, но при этом первоначальное окно ни куда не пропадает, а поверх него отображается заявленное окно.
Как удалить первоначальное окно?
from tkinter import *
from tkinter.ttk import Frame, Button, Style
class BasicMode(Frame):
def __init__(self, master):
super().__init__(master)
self.my_window()
def make_digit_button(self, digit): # rr создание цифровых кнопок
return Button(self, text=digit, style='btn_color.TButton')
def my_window(self):
Style().configure('one.TButton', background='red')
# yy показываем цифровое поле
self.text_field = Text(self, foreground='black', padx=10, pady=5, relief='sunken', bd=5,
font=('serif', 14, 'bold'), height=1, width=20)
self.text_field.grid(row=0, columnspan=5, sticky='we', padx=10, pady=(5, 10))
self.clb = Button(self, text='?', style='one.TButton', command=lambda: Calculator().mode_switch())
self.clb.grid(row=1, column=0)
# yy Оформление кнопок
self.make_digit_button('7').grid(row=3, column=0)
self.make_digit_button('8').grid(row=3, column=1)
self.make_digit_button('9').grid(row=3, column=2)
self.make_digit_button('4').grid(row=4, column=0)
self.make_digit_button('5').grid(row=4, column=1)
self.make_digit_button('6').grid(row=4, column=2)
self.make_digit_button('1').grid(row=5, column=0)
self.make_digit_button('2').grid(row=5, column=1)
self.make_digit_button('3').grid(row=5, column=2)
self.make_digit_button('0').grid(row=6, columnspan=2, sticky='we', padx=2, pady=(3, 4))
self.make_digit_button('.').grid(row=6, column=2)
class AdvancedMode(Frame):
def __init__(self, master):
super().__init__(master)
self.create_field()
def create_field(self):
# yy надпись перед цифровым полем
self.label = Label(self, text='ID', font=('serif', 15), pady=5).grid(row=1, column=0)
# yy показываем цифровое поле
self.second_display = Text(self, foreground='black', padx=10, pady=5, font=('serif', 12), height=1, width=20)
self.second_display['state'] = 'disable'
self.second_display.grid(row=1, column=1, sticky='we', padx=10, pady=(0, 10))
class Calculator(Tk):
def __init__(self):
super().__init__()
self.frame_a = BasicMode(self)
self.frame_a.pack(side=LEFT, padx=10, pady=10)
self.frame_b = AdvancedMode(self)
self.frame_b.pack(side=RIGHT, padx=10, pady=10)
self.title("Калькулятор - базовый режим")
self.trigger = True
self.frame_b.pack_forget()
def mode_switch(self): # переключатель режимов
if self.trigger:
self.frame_a.destroy()
self.title("Калькулятор - расширенный режим")
self.frame_a = BasicMode(self)
self.frame_a.pack(side=LEFT, padx=10, pady=10)
self.frame_b.pack()
# yy изменение размера многострочного текстового поля
self.frame_a.text_field['height'] = 8
self.trigger = False
else:
self.title("Калькулятор - базовый режим")
self.frame_a.text_field['height'] = 1
self.trigger = True
if __name__ == '__main__':
app = Calculator()
app.mainloop()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я не уверен что правильно понял вас, но попробуйте так:
from tkinter import *
from tkinter.ttk import Frame, Button, Style
class BasicMode(Frame):
def __init__(self, master):
super().__init__()
self.master = master # +++
self.my_window()
def make_digit_button(self, digit): # rr создание цифровых кнопок
return Button(self, text=digit, style='btn_color.TButton')
def my_window(self):
Style().configure('one.TButton', background='red')
# yy показываем цифровое поле
self.text_field = Text(self, foreground='black', padx=10, pady=5, relief='sunken', bd=5,
font=('serif', 14, 'bold'), height=1, width=20)
self.text_field.grid(row=0, columnspan=5, sticky='we', padx=10, pady=(5, 10))
# +++
self.clb = Button(self,
text='Расширенный режим',
# text='?',
# style='one.TButton'#,
# command=lambda: Calculator().mode_switch()
command=lambda: self.master.mode_switch() # +++
)
self.clb.grid(row=1, column=0)
# yy Оформление кнопок
self.make_digit_button('7').grid(row=3, column=0)
self.make_digit_button('8').grid(row=3, column=1)
self.make_digit_button('9').grid(row=3, column=2)
self.make_digit_button('4').grid(row=4, column=0)
self.make_digit_button('5').grid(row=4, column=1)
self.make_digit_button('6').grid(row=4, column=2)
self.make_digit_button('1').grid(row=5, column=0)
self.make_digit_button('2').grid(row=5, column=1)
self.make_digit_button('3').grid(row=5, column=2)
self.make_digit_button('0').grid(row=6, columnspan=2, sticky='we', padx=2, pady=(3, 4))
self.make_digit_button('.').grid(row=6, column=2)
class AdvancedMode(Frame):
def __init__(self, master):
super().__init__()
self.master = master
self.create_field()
def create_field(self):
# yy надпись перед цифровым полем
self.label = Label(self, text='ID', font=('serif', 15), pady=5).grid(row=1, column=0)
# yy показываем цифровое поле
self.second_display = Text(self, foreground='black', padx=10, pady=5, font=('serif', 12), height=1, width=20)
self.second_display['state'] = 'disable'
self.second_display.grid(row=1, column=1, sticky='we', padx=10, pady=(0, 10))
class Calculator(Tk):
def __init__(self):
super().__init__()
self.frame_a = BasicMode(self)
self.frame_a.pack(side=LEFT, padx=10, pady=10)
self.frame_b = AdvancedMode(self)
self.frame_b.pack(side=RIGHT, padx=10, pady=10)
self.title("Калькулятор - базовый режим")
self.trigger = True
self.frame_b.pack_forget()
def mode_switch(self): # переключатель режимов
if self.trigger:
self.title("Калькулятор - расширенный режим")
self.frame_b.pack()
# yy изменение размера многострочного текстового поля
self.frame_a.text_field['height'] = 8
self.trigger = False
self.frame_a.clb['text'] = "Базовый режим" # +++
else:
self.title("Калькулятор - базовый режим")
self.frame_a.text_field['height'] = 1
self.trigger = True
self.frame_a.clb['text'] = "Расширенный режим" # +++
if __name__ == '__main__':
app = Calculator()
app.mainloop()