Python, Tkinter - Как запустить shelve.close () при выходе из программы графического интерфейса? - PullRequest
0 голосов
/ 18 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

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

root.mainloop() # starts the GUI and waits for the GUI to close
shelve.close() # do something after the GUI closes
0 голосов
/ 18 сентября 2018

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

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

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

...