如何使用Python检查gnome-shell通知?

时间:2013-01-05 14:03:06

标签: notifications gnome-shell

我在做这件事时遇到了一些麻烦:
我在我的Archlinux发行版上使用Conky并在python中编写了一个快速脚本来检查我的gmail中是否有新邮件。在我的conkyrc中,这个脚本每5分钟执行一次,并返回一些邮件(如果我没有,则返回0)。工作良好。

我想做的是:
如果邮件数量> 0然后显示通知(gnome-shell通知)。我现在唯一的问题是,如果我有未读邮件(例如4封邮件未读),每5分钟一次,会有一条新通知说我有4封邮件未读。我想做的是检查是否已有通知,以便我不必再显示它...有谁知道如何解决这类问题?

这是我的代码:

#!/usr/bin/python

from gi.repository import Notify
from urllib.request import FancyURLopener

url = 'https://%s:%s@mail.google.com/mail/feed/atom' % ("username", "password")

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)

if unread != "0" :
    Notify.init ("New Mail")
    Hello=Notify.Notification.new ("New mail","You have "+unread+" new mail(s)","/usr/share/icons/Faenza/actions/96/mail-forward.png")
    Hello.show ()

我必须确切地说我对python很新。如果有人得到解决方案,请提前致谢:)

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是将未读的值序列化到文件中。

然后更改您的支票,如果邮件数量大于0,如果邮件数量大于零或与文件中最后一个序列化计数不同。

这样做的一个扩展是序列化通知与邮件计数一起运行的时间,这样你就可以延长检查以显示重复通知(显示4次电子邮件两次,而不是每5分钟说一次,但每3次小时)。

因此,您的原始支票为if unread != "0" :,它会变成if unread != "0" && unread != serialisedvalue:。在显示重复通知时间阈值的情况下 它变成了

if unread != "0":
    if ((datetime.now() - serialiseddate) < threshold) :
        if unread != serialisedvalue:

threshold = 3600*3为3小时。

序列化和反序列化的示例代码如下

#Serialising
try:
    # This will create a new file or **overwrite an existing file**.
    f = open("mailcount.txt", "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

#Deserialising 
try:
    f = open("mailcount.txt", "r")
    try:
        # Read the entire contents of a file at once.
        serialisedvalue = f.readline()
        serialseddate = datetime.strptime(f.readline(), '%b %d %Y %I:%M%p')
    finally:
        f.close()
except IOError:
    pass

另一种可能的解决方案是以某种方式获取当前活动通知计数并将其添加到您的条件中,尽管我找不到使用API that Notify uses执行此操作的方法。