Почему программа на tkinter работает непостоянно?

Вот код:

from tkinter import*

root=Tk()
root.title("Okno")
root.geometry("600x600")

def calc():
    global root
    global menu
    root.destroy()
    root=Tk()
    root.title("Okno")
    root.geometry("600x600")    
    bu=Button(text='menu', command=menu).grid()

def menu():
    global root
    global calc
    root.destroy()
    root=Tk()
    root.title("Okno")
    root.geometry("600x600")
    
    main_menu = Menu()
    menu_menu = Menu()
    
    menu_menu = Menu(font=("Verdana", 13, "bold"), tearoff=0)
    
    menu_menu.add_command(label="Calc", command=calc)
    menu_menu.add_command(label="Menu", command=menu)
    
    main_menu.add_cascade(label="Menu", menu=menu_menu)
    
    calc=Button(text="calc", command=calc)
    calc.grid()
    
    root.config(menu=main_menu)
    
menu()
root.mainloop()

Попробуйте его запустить: окна будут переключаться несколько раз. А потом программа прекращает работать.

В чем дело?


Ответы (1 шт):

Автор решения: n1tr0xs
  1. В menu вы вызываете root.destroy(), а его задача - уничтожить окно.
  2. Вы затираете функция calc, создавая кнопку.
    После создания кнопки напиши эту строку print(type(calc)), и увидите, что теперь это не function, а tkinter.Button.
  3. В функции calc вы опять вызываете root.destroy()

Я бы посоветовал полностью переработать архитектуру приложения дабы избежать использования global. Но здесь недостаточно данных, чтобы давать какие-то конкретные советы. Минимальные исправления в вашем коде для работоспособности:

from tkinter import*

root=Tk()
root.title("Okno")
root.geometry("600x600")

def calc():
    global root
    global menu
    root.destroy()
    root=Tk()
    root.title("Okno")
    root.geometry("600x600")    
    Button(text='menu', command=menu).grid() # <----

def menu():
    global root
    global calc
    root.destroy()
    root=Tk()
    root.title("Okno")
    root.geometry("600x600")
    
    main_menu = Menu()
    menu_menu = Menu()
    
    menu_menu = Menu(font=("Verdana", 13, "bold"), tearoff=0)
    
    menu_menu.add_command(label="Calc", command=calc)
    menu_menu.add_command(label="Menu", command=menu)
    
    main_menu.add_cascade(label="Menu", menu=menu_menu)
    
    Button(text="calc", command=calc).grid() # <----
    
    root.config(menu=main_menu)
    
menu()
root.mainloop()

→ Ссылка