3

I'm trying to create a Python notification application. To make it short here is what I wanted to do :
1. Checking my gmail account
2. Display a notification with the number of unread mails
3. Display a button that permits me to open chromium (using a system call)

For now everything looks just fine. The checking mail part was kind of easy. I serialised my unread mail count so that the notification doesn't show up every single minute. It only displays if I have a new mail.
Where I'm blocking is that I don't know how to create the main gtk loop so that I can handle the button signal.

Here is my code :

#!/usr/bin/python


from gi.repository import Notify, Gtk, GLib
from urllib.request import FancyURLopener
from datetime import datetime, date, time, timedelta
import os.path, sys, getopt
from subprocess import call

serialisedvalue=0;
serialiseddate=0;

def callback():
        call(["chromium", "gmail.com"])

def serialise(unread):
        try:
                f = open("mailcount", "w")
                try:
                        f.write(unread+"\n") # Write a string to a file
                        f.write(datetime.now().strftime('%b %d %Y %I:%M%p'))
                finally:
                        f.close()
        except IOError:
                pass

def deserialise():
        global serialisedvalue
        global serialiseddate
        try:
                f = open("mailcount", "r")
                try:
                        serialisedvalue = f.readline().rstrip()
                        serialiseddate = datetime.strptime(f.readline(), '%b %d %Y %I:%M%p')
                finally:
                        f.close()
        except IOError:
                pass

def notif(unread):
        Notify.init ("New Mail")
        if unread != "1":
                Hello=Notify.Notification.new ("New mail","You have "+unread+" unread mails","/usr/share/icons/Faenza/actions/96/mail-forward.png")
        else :
                Hello=Notify.Notification.new ("New mail","You have "+unread+" unread mails","/usr/share/icons/Faenza/actions/96/mail-forward.png")
        Hello.add_action('action', 'Read', callback, None, None)
        Hello.show ()

def main(argv):

        notify=0
        forced=0
        try:
                opts, args = getopt.getopt(argv,"nf",['notify','force-notify'])
        except getopt.GetoptError:
                print("unreadgmail.py [-n --notify] [-f --force-notify")
                sys.exit(2)
        for opt,args in opts:
                if opt in ("-n", "--notify"):
                        notify=1
                elif opt in ("-f","--force-notify"):
                        forced=1
        url = 'https://%s:%s@mail.google.com/mail/feed/atom' % ("myaccount", "mypassword")
        opener = FancyURLopener()
        page = opener.open(url)
        contents = page.read().decode('utf-8')
        ifrom = contents.index('<fullcount>') + 11
        ito   = contents.index('</fullcount>')
        unread = contents[ifrom:ito]
        print("Unread messages : "+unread)
        if notify==1 and forced==0:
                if os.path.exists("mailcount"):
                        deserialise()
                else:
                        serialise(unread)
                        deserialise()
                if unread != "0":
                        if unread != serialisedvalue:
                                notif(unread)
                                serialise(unread)
                        elif ((datetime.now() - serialiseddate) > timedelta(hours=1)):
                                notif(unread)
        if forced==1:
                notif(unread)
        GLib.MainLoop().run()




if __name__ == "__main__":
   main(sys.argv[1:])

I remember that my notifications used to work fine with pygtk and pynotify. Though I want to update my code and since I lost the last code, I don't have a clue on that. Calling Gtk.main() in my main just block the program until I kill it.

I'm using Gnome3.6, Archlinux and python3.3.
So does anyone know how to "wait" for the signal handler to be clicked before the program ends ? In fact it runs fine, but the script just end when the notification is displayed and it doesn't wait for the signal.

Thanks a lot :)

EDIT : A bit more details of my problem : The final result
As you can see, the program already ended and is not waiting for a signal. That's what I'm trying to solve right now.

Depado
  • 4,811
  • 3
  • 41
  • 63

1 Answers1

0

If you're not using GTK+--which as far as I can tell you aren't--you could probably call GLib.MainLoop().run() at the end of your main function to keep your program running.

Micah Carrick
  • 9,967
  • 3
  • 31
  • 43
  • Thanks for your answer. I just have a problem it seems I can't import glib. EDIT : It seems I can import Glib using `from gi.repository import Glib` though it returns me this error : `ERROR:root:Could not find any typelib for Glib` – Depado Jan 28 '13 at 08:00
  • I managed to find out. It's actually `from gi.repository import GLib` It works, my program doesn't end, though my signal handler seems not to work. Any idea ? :/ – Depado Jan 28 '13 at 08:39