Задать вопрос
@lestreng_b

Как прописать динамическое удаление и создание кнопки (python, tkinter)?

здравствуйте. творю программу, все события происходят в одном окне. после нажатия на любую кнопку сейчас происходит удаление всех виджетов и создание новых, которые всегда включают в себя "назад" - возвращение к предыдущим. так вот. как правильно организовать событие кнопки "назад", если повторное создание всех виджетов не возможно и не логично (из - за событий, включающих в себя ЕЩЕ события и тд. и тп.)?

п.с.: где - то видел, что можно использовать pack - pack_forget, но не выходит. если это все же является подходящим вариантом, то, пожалуйста, помогите внедрить его в код так, чтобы тот работал.

сама программа в сокращении:

from tkinter import *

def destroyER_MAIN_MENU():
    destroy_object_1 = [label_TEXT_MM, button_GO_LEAN, button_DIDA, button_EXIT]
    for object_name_1 in destroy_object_1:
        object_name_1.destroy()

ROOT.title("SCHCode")
ROOT.geometry("650x450+350+120")
ROOT.resizable(False, False)

text_MAIN_MENU = "SCHCode - ...текст..."

label_TEXT_MM = Label(text=text_MAIN_MENU, width = 50, )
label_TEXT_MM.place(relx=.450, rely=.20)

button_GO_LEAN = Button(ROOT, text ="УЧИТЬ ЯЗЫКИ", pady="10", padx="77", command=destroyER_MAIN_MENU)
def fun(event):

    def destroyER_MENU_GO_LEAN():
        destroy_object_2 = [button_PASCAL_1, button_PASCAL_2, button_PYTHON_1, button_PYTHON_2, button_NAZAD_VIBOR_YAZIKA]
        for object_name_2 in destroy_object_2:
            object_name_2.destroy()

    button_PASCAL_1 = Button(ROOT, text="PASCAL - ПЕРВЫЙ ЭТАП", pady="10", padx="30", command=destroyER_MENU_GO_LEAN)
    button_PASCAL_1.pack(x=20, y=80)

    button_PASCAL_2 = Button(ROOT, text="PASCAL - ВТОРОЙ ЭТАП", pady="10", padx="30", command=destroyER_MENU_GO_LEAN)
    button_PASCAL_2.pack(x=20, y=160)

    button_PYTHON_1 = Button(ROOT, text="PYTHON - ПЕРВЫЙ ЭТАП", pady="10", padx="30", command=destroyER_MENU_GO_LEAN)
    button_PYTHON_1.pack(x=20, y=240)

    button_PYTHON_2 = Button(ROOT, text="PYTHON - ВТОРОЙ ЭТАП", pady="10", padx="30", command=destroyER_MENU_GO_LEAN)
    button_PYTHON_2.pack(x=20, y=320)

    button_NAZAD_VIBOR_YAZIKA = Button(ROOT, text="НАЗАД", pady="10", padx="20", command=destroyER_MENU_GO_LEAN)
    button_NAZAD_VIBOR_YAZIKA.place(x=555, y=400)
    def fun(event):
        button_EXIT.pack()
    button_NAZAD_VIBOR_YAZIKA.bind("<Button-1>", fun)

button_GO_LEAN.bind("<Button-1>", fun)
button_GO_LEAN.pack(x=20, y=95)

#следующая кнопка

button_DIDA = Button(ROOT, text ="ДИДАКТИЧЕСКИЕ МАТЕРИАЛЫ", pady="10", padx="30", command=destroyER_MAIN_MENU)
button_DIDA.pack(x=20, y=190)

button_EXIT = Button(ROOT, text ="ВЫХОД", pady="10", padx="97", command=ROOT.destroy)
button_EXIT.pack(x=20, y=285)

ROOT.mainloop()


п.с.(х2): и было бы очень здорово, если вы подскажите мне мои ошибки.
  • Вопрос задан
  • 1846 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Не надо ничего удалять и создавать заново. Надо просто расположить окна одно над другим и показывать нужное в нужный момент:
import tkinter as tk


class WizardLikeApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (StartPage, PageOne, PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky='nsew')

        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

        
class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        label = tk.Label(self, text='Start Page')
        label.pack(pady=10, padx=10)

        button = tk.Button(self, text='Visit Page 1',
                           command=lambda: controller.show_frame(PageOne))
        button.pack()

        button2 = tk.Button(self, text='Visit Page 2',
                            command=lambda: controller.show_frame(PageTwo))
        button2.pack()


class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        label = tk.Label(self, text='Page One')
        label.pack(pady=10, padx=10)

        button1 = tk.Button(self, text='Back to Home',
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

        button2 = tk.Button(self, text='Page Two',
                            command=lambda: controller.show_frame(PageTwo))
        button2.pack()


class PageTwo(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        label = tk.Label(self, text='Page Two')
        label.pack(pady=10, padx=10)

        button1 = tk.Button(self, text='Back to Home',
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

        button2 = tk.Button(self, text='Page One',
                            command=lambda: controller.show_frame(PageOne))
        button2.pack()
        

app = WizardLikeApp()
app.mainloop()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы