[Sugar-devel] [PATCH] Pippy example - birthday reminder

Dinko Galetic dinko.galetic at gmail.com
Thu Jun 3 04:40:36 EDT 2010


This example works as a birthday reminder.
It demonstrates the use of dictionaries and several other things (like
functions) already covered in the existing examples, but now put in a larger
program.

PS. I now notice I've pushed this code with "switch" in comments instead of
"if-else", I'll change that.

Dinko Galetic

diff --git a/data/GSOC examples/birthday reminder b/data/GSOC
examples/birthday
new file mode 100644
index 0000000..eca9458
--- /dev/null
+++ b/data/GSOC examples/birthday reminder
@@ -0,0 +1,201 @@
+# The purpose of this example is to demonstrate what is a dictionary in
Python.
+# This will also cover:
+    # functions,
+    # switch, and
+    # writing to text files.
+
+
+# This function adds a birthday to the list of birthdays.
+# Simple, isn't it?
+# There's one flaw, though: In case we've already stored the data for that
+# person, it will overwrite that data.
+def add_birthday(person, day, birthdays):
+    birthdays[person] = day
+
+# This does the same as the previous function, but checks if we already
have
+# the birthday of that person remembered and warns us in that case.
+# Practice: This function is not used in this example, only defined.
+# Could you change the code so that it is used instead of
+# the default "add_birthday" function?
+def add_birthday_safer(person, day, birthdays):
+    if birthdays.has_key(person):
+        print "You've already entered " + person + "'s birthday as:",
+        print birthdays[person]
+        print "Would you like to overwrite that with " + day + " (y/n)?"
+        response = raw_input("Response: ")
+        # Practice: Add some more possible answers (like with capital
letters)
+        if response == "n" or response == "no":
+            # "return" marks the end of the function
+            return
+        else:
+            birthdays[person] = day
+
+# To change an existing record: just overwrite whatever was there before!
+# It will simply add a new record if there wasn't a person with the given
name,
+# and that is fine. Because of that, we don't have to check if the record
exist
+def change_birthday(person, day, birthdays):
+    birthdays[person] = day
+
+# This function deletes a birthday.
+def forget_birthday(person, birthdays):
+    if birthdays.has_key(person):
+        del birthdays[person]
+    else:
+        print "No such person."
+
+# This function check if it's anyone's birthday today.
+def check_birthdays(birthdays):
+    # this will get us the today's date in the form ddmm, the same
+    # as we enter it. We don't need the year, most people have birthdays
+    # each year. :)
+    # Practice: Who doesn't?
+    today = time.strftime("%d%m")
+
+    none_today = True
+
+    for person in birthdays:
+        bday = birthdays[person]
+        # How do we know which birthday is it?
+        # Easy: current year - birth year.
+        # time.strftime("%Y") gets us the current year, and the birth year
+        # is written in "bday" variable, from 4th index to the last.
+        # Since both are written as strings, we have to turn them to
numbers
+        # before we can subtract them, and we do that by passing them to
the in
+        # function. When they are subtracted, turn the result back into a
strin
+        # by passing it to the str() function.
+        which = str( int(time.strftime("%Y")) - int(bday[4:]) )
+
+        if bday[0:4] == today:
+            print "It's " + person + "'s " + which + ". birthday, yay!"
+            none_today = False
+
+    if none_today:
+        print "No birthdays today."
+
+# Practice: Could we make the output of this function nicer?
+# For example, change it to the form of dd.mm.yyyy instead of ddmmyyy ?
+def print_birthdays(birthdays):
+    for person, day in birthdays.items():
+        print person + " was born on " + day + "."
+    if len(birthdays.items()) == 0:
+        print "There are no birthdays memorised."
+
+# This function takes a name and finds that person's birthday.
+def find_birthday(name, birthdays):
+    if birthdays.has_key(name):
+        print name + "'s birthday is on: " + birthdays[name]
+    else:
+        print "You never entered " + name + "'s birthday!"
+
+
+def save_to_file(filename, bdays):
+    # Warning: If there already exists a file with this name, opening it in
"w"
+    # mode will delete the existing file and create a blank one!
+    # Opening in "a"ppend mode adds everything to the end of an existing
file,
+    # but we won't use it here.
+    # Practice: Try writing a program which appends to text files to see
how it
+    f = open(filename, "w")
+    # Practice: What does str(bdays) give us? Try it on a dictionary
variable!
+    text = str(bdays)
+    f.write(text)
+    f.close()
+
+def load_from_file(filename):
+    my_file = open(filename, "r")
+    text_from_file = my_file.read()
+
+    # eval() takes text and then runs it as if it were Python code.
+    # For us, it will turn a textual representation of a dictionary to a
functi
+    # Python dictionary.
+    bday_dictionary = eval(text_from_file)
+
+    # Return that to whoever called load_from_file() in the first place.
+    return bday_dictionary
+
+# This function displays the menu which you see when you run the program.
+def menu():
+    # Here we will store all the birthday data. Notice the {} - that's how
we
+    # define that a variable is a dictionary.
+    # This will get us an empty dictionary, and we'll see how to fill it
+    # with data in a moment.
+    birthdays = {}
+
+    # We'll display the menu in an infinite loop.
+    # The condition in while() will always be true, since it's, well..
True.
+    # The entire function, though, will end when the user enters "7".
+    while (True):
+        # Print thirty # and move to a new line.
+        print "#" * 60 + "\n"
+        print "Please choose from the following: "
+        print "\t1. Print all birthdays we have remembered."
+        print "\t2. Check if someone's birthday is today."
+        print "\t3. Find someone's birthday."
+        print "\t4. Add a new birthday."
+        print "\t5. Change the data for an existing birthday."
+        print "\t6. Delete an existing birthday."
+        print "\t7. Write all birthdays to a file."
+        print "\t8. Load birthdays from a file."
+        print "\t9. Exit."
+        choice = raw_input("Your choice: ")
+        if choice == "1":
+            print_birthdays(birthdays)
+
+        elif choice == "2":
+            check_birthdays(birthdays)
+
+        elif choice == "3":
+            print "Enter your friend's name: "
+            name = raw_input()
+            find_birthday(name, birthdays)
+
+        elif choice ==  "4":
+            print "Enter your friend's name: "
+            name = raw_input()
+            print "Enter " + name + "'s birthday (ddmmyyyy): "
+            birthday = raw_input()
+            add_birthday(name, birthday, birthdays)
+
+        elif choice == "5":
+            print "Enter your friend's name: "
+            name = raw_input()
+            print "Enter " + name + "'s birthday (ddmmyyyy): "
+            birthday = raw_input()
+            change_birthday(name, birthday, birthdays)
+
+        elif choice == "6":
+            print "Enter your friend's name: "
+            name = raw_input()
+            forget_birthday(name, birthdays)
+
+        elif choice == "7":
+            print "Enter the name of the file in which to store: "
+            filename = raw_input()
+            print "Location of that file (can be blank): "
+            filename = raw_input() + filename
+            save_to_file(filename, birthdays)
+
+        elif choice == "8":
+            print "Name of the file with stored birthdays: "
+            filename = raw_input()
+            print "Location of that file (can be blank): "
+            filename = raw_input() + filename
+            # Warning! Doing this will overwrite anything we're put in our
dict
+            # so far with that is saved in that file.
+            birthdays = load_from_file(filename)
+
+        # Practice: Currently, there's no way for a user to load data from
two
+        # different files at once. It would be possible to ask for two
filename
+        # a write a function which would take those two filenames, read
from bo
+        # files and combine their content into one dictionary.
+        # A hint: dictionaries have a method called "update",
+        # look it up to see what it does!
+
+        elif choice == "9":
+            return
+
+# This is where our program starts executing. It enters the menu() function
and
+# runs it until you choose to leave.
+print "Welcome to the birthday reminder."
+import time
+menu()
+print "Exiting the birthday reminder... Bye!"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.sugarlabs.org/archive/sugar-devel/attachments/20100603/a524a9c5/attachment.htm 


More information about the Sugar-devel mailing list