При нажатии на кнопку для отображения скрытого фрейма отображается первоначальное окно, а поверх него новое. Как убрать первоначальное окно?

В программе калькулятор создаю два режима: базовый и расширенный.
При нажатии на кнопку ? правее базового фрейма (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()

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка