В зависимости от активности Tkinter, end esp. при использовании Tkinter.after остановка этого действия с помощью destroy()
- даже с использованием protocol (), кнопки и т. д. - нарушит это действие (ошибка «во время выполнения»), а не просто прекратит его. Лучшее решение почти в каждом случае - использовать флаг. Вот простой, глупый пример того, как его использовать (хотя я уверен, что большинству из вас это не нужно!):
from Tkinter import *
def close_window():
global running
running = False
print "Window closed"
root = Tk()
root.protocol("WM_DELETE_WINDOW", close_window)
cv = Canvas(root, width=200, height=200); cv.pack()
running = True;
# This is an endless loop stopped only by setting 'running' to 'False'
while running:
for i in range(200):
if not running: break
cv.create_oval(i,i,i+1,i+1); root.update()
Это хорошо завершает графическую активность. Вам нужно только проверить running
в нужном месте (ах).