Python Tkinter countdown app with a freezing GUI
Tkinter is already in a loop. The window handler gets all messed up because of your own loop, which is called synchronously. Effectively you're running a loop in a loop and wonder why the outer loop takes so long to get to the next step. That's because of the inner loop taking so much time.

Long story short, your next window update will only commence once the countdown loop is finished.

There's mainly 2 ways of fixing that.


Don't loop.
Use asynchronous (or threaded) loops instead.


Basically, you'll need a function start_countdown which starts a threaded version of countdown. That would probably look something like this:

import threading


class MyFirstGUI:
    # Init and rest of methods snipped for brevity
    def refresh(self):
        self.root.update()
        self.root.after(1000,self.refresh)

    def start_countdown(self):
        self.refresh()
        threading.Thread(target=countdown).start()


Now, the countdown will be calculated in a thread that doesn't halt the current loop (the Tkinter main window). With that as basis, see if you can rebuild your countdown method. You'll see it becomes more focussed on the actual calculations and less on the screen.

Please see this answer on Stack Overflow for the complete story on how to work with Tkinter and calls that would ordinarily block.