root.protocol
требует ссылки на функцию.Вместо этого вы немедленно вызываете функцию и затем передаете результат.
Рассмотрите этот код:
root.protocol("WM_DELETE_WINDOW", app.exit_func())
Этот код функционально идентичен этому:
result = app.exit_func()
root.protocol("WM_DELETE_WINDOW", result)
Вместо этого вам нужно передать ссылку в функцию:
root.protocol("WM_DELETE_WINDOW", app.exit_func)