Count down timer

#!/usr/bin/env python
#
# [SNIPPET_NAME: Count down timer]
# [SNIPPET_CATEGORIES: PyGTK, gobject]
# [SNIPPET_DESCRIPTION: Two examples of how to make a count down timer]
# [SNIPPET_LICENSE: GPL]
# [SNIPPET_AUTHOR: Simon Vermeersch <[email protected]>]
# [SNIPPET_DOCS: http://www.pygtk.org/pygtk2reference/gobject-functions.html#function-gobject--timeout-add]

import gtk, gobject

class CounterApp:
    def __init__(self):
        self.w = gtk.Window()
        self.w.connect("destroy", lambda wid: gtk.main_quit())
        self.w.connect("delete_event", lambda a1,a2:gtk.main_quit())

        vbox = gtk.VBox()
        self.w.add(vbox)

        self.label = gtk.Label("Counter example")
        vbox.pack_start(self.label)

        hbox = gtk.HBox()
        vbox.pack_start(hbox)

        btn1 = gtk.Button("Method 1")
        btn1.connect("clicked", self.btn1_clicked)
        hbox.pack_start(btn1)

        btn2 = gtk.Button("Method 2")
        btn2.connect("clicked", self.btn2_clicked)
        hbox.pack_start(btn2)

        self.w.show_all()

    def btn1_clicked(self, sender):
        counter = 15
        while counter >= 0:
            gobject.timeout_add(counter * 1000, self.countdown_function_method1, 15-counter)
            counter -= 1

    def countdown_function_method1(self, counter):
        if counter > 0:
            self.label.set_text("Remaining: " + str(counter))
        else:
            self.label.set_text("All done!")

    def btn2_clicked(self, sender):
        self.counter = 15
        gobject.timeout_add(1000, self.countdown_function_method2)
        self.countdown_function_method2()

    def countdown_function_method2(self):
        if self.counter > 0:
            self.label.set_text("Remaining: " + str(self.counter))
            self.counter -= 1
            return True
        else:
            self.label.set_text("All done!")
            return False
if __name__ == "__main__":
    app = CounterApp()
    gtk.main()