У меня есть простая программа gui (tkinter), которая записывает данные в файл. Использует полку. Как запустить shelve.close (), когда я хочу отключить программу?

-2
Mr Korni 18 Сен 2018 в 16:10

2 ответа

Лучший ответ

Канонический способ закрыть что-то несмотря ни на что - это использовать диспетчеры контекста:

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()

Этот метод хуже, потому что он зависит от tk запуска события. Вместо этого используйте метод диспетчера контекста, чтобы охватить все основания.

3
nosklo 19 Сен 2018 в 16:23

Вызов mainloop прекращается, когда останавливается ваш графический интерфейс. Если вы хотите запустить некоторый код после выхода из GUI, просто поставьте его после mainloop().

root.mainloop() # starts the GUI and waits for the GUI to close
shelve.close() # do something after the GUI closes
0
Novel 18 Сен 2018 в 15:29