Канонический способ закрытия чего-либо независимо от того, что происходит - это использование менеджеров контекста:
with shelve.open(...) as myshelve:
# ALL YOUR CODE HERE
root.mainloop()
Это гарантирует, что будет вызван shelve.close (), дажекогда вы получаете какие-либо исключения в коде.
Это также рекомендуемый способ в документации :
Не полагайтесь на автоматическое закрытие полки;всегда вызывайте close()
явно, когда он вам больше не нужен, или используйте shelve.open()
в качестве менеджера контекста .
В качестве альтернативы, поскольку вы используете tkinter,Вы можете использовать событие WM_DELETE_WINDOW
:
import tkinter as tk
root = tk.Tk()
def when_window_is_closed():
myshelve.close()
root.destroy()
root.protocol("WM_DELETE_WINDOW", when_window_is_closed)
root.mainloop()
Этот метод хуже, потому что он зависит от запуска события.Вместо этого используйте метод менеджера контекста, чтобы охватить все основания.