2

Python通知アプリケーションを作成しようとしています。簡単に言うと、私がやりたかったことです
。1. Gmailアカウントを確認する
2.未読メールの数を示す通知を
表示する3.クロムを開くことを許可するボタンを表示する(システムコールを使用)

今のところ、すべてがうまく見えます。メールの確認部分はちょっと簡単でした。通知が1分ごとに表示されないように、未読メール数をシリアル化しました。新着メールがある場合にのみ表示されます。
私がブロックしているのは、ボタン信号を処理できるようにメインのgtkループを作成する方法がわからないことです。

これが私のコードです:

#!/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:])

私の通知は、pygtkとpynotifyで正常に機能していたことを覚えています。コードを更新したいのですが、最後のコードを失ったので、それについての手がかりがありません。メインでGtk.main()を呼び出すと、プログラムを強制終了するまでブロックするだけです。

私はGnome3.6、Archlinux、python3.3を使用しています。
では、プログラムが終了する前にシグナルハンドラがクリックされるのを「待つ」方法を知っている人はいますか?実際には正常に実行されますが、通知が表示されたときにスクリプトが終了し、シグナルを待機しません。

どうもありがとう :)

編集:私の問題のもう少し詳細:ご覧の 最終結果
とおり、プログラムはすでに終了しており、シグナルを待機していません。それが私が今解決しようとしていることです。

4

1 に答える 1

0

GTK+ を使用していない場合 (私が知る限りではそうではありません)、おそらく関数GLib.MainLoop().run()の最後で呼び出してmain、プログラムを実行し続けることができます。

于 2013-01-27T02:11:13.567 に答える