web-dev-qa-db-ja.com

Pythonのクロスプラットフォームデスクトップ通知機能

Pythonで Growl -like、Windows balloon-tip-like notifications libraryを探しています。次のようなコードを想像してみてください。

>>> import desktopnotifier as dn
>>> dn.notify('Title', 'Long description goes here')

..そして、Mac、Windows、Linuxの対応するツールチップで通知されます。そのようなライブラリは存在しますか?そうでない場合、自分でどのように書きますか?

  • Macにはデフォルトの通知機能が付いていますか? Growl は別にインストールする必要がありますか?
  • Windowsでは、これには pywin32
  • Linuxでは、GNOMEを想定して、これを行うGNOME API(gnome-pythonを使用)はありますか?
  • すべてのプラットフォームで通知を「スティッキー」(つまり、フェードアウトしない)にすることはできますか?

更新:私の好みはしないシンプルなタスクのためにPyQT4やwxPythonのような巨大なGUIフレームワークに依存していますこのような。

46

これは、数年前にwxPythonを使用して書いたデスクトップ通知です -これは、WindowsとLinuxで同じように動作し、OSXでも動作するはずです。これには、クリック可能なアイコンとメッセージを含む通知ウィンドウをアニメーション化するために使用できるスレッド化されたイベントループが含まれています。独自の目的に合わせてカスタマイズするには、おそらくいくつかの調整が必要ですが、基本的な作業は完了しています。

19

Pycon 2010には クロスプラットフォームに関するプレゼンテーションPython development がありました。クロスプラットフォーム通知に関するいくつかのアドバイスを含む、それに関するHTMLページもありました。しかし、 、オンラインではもう見つかりませんが、ローカルコピーを保存しました。これは通知の一部です。

アプリケーションがユーザーに何かについて通知したい場合があります。ソフトウェアの更新が利用可能である、新しいインスタントメッセージが受信された、300ページの印刷ジョブが最終的に終了した、などです。

  • 通知をクロスプラットフォームに簡単に移植できるようにするには、通知をインタラクティブにしないでください。たとえば、Ubuntuはユーザーの操作を必要とする通知をサポートしていません。
  • これらは最も重要なライブラリです:

    o Linux: pynotify

    o Mac OS X:標準ではないGrowlが通常インストールされます。

    o Windows:優れたwxPythonソリューションは、Andrea Gavanaの ToasterBox で、FirefoxまたはThunderbirdの通知の外観を模倣しています。

  • Phatchについては、これら3つのシステムを1つのAPIに統合するライブラリ phatch/lib/notify.py を開発しました。

リンクされたpythonファイルは非常に興味深いものであり、リンクされたpythonファイルをほとんどそのまま使用できるはずです。コードも非常に明確です。それで、あなたはそれが何をするかをすぐに見るでしょう。

基本的なアプローチは、プラットフォームにほとんど関係なく、使用可能な通知システムを検出し、それらを特定の順序で使用しようとしますが、必要に応じてより単純なシステムにフォールバックします。このようにして、ユーザーがGrowlをインストールすると、プラットフォームに関係なく使用されます。

上記の3つ以外の通知システムのサポートを提供するためにそれを適合させることができます。

17
Rabarberski
  • それを書き始める方法

    keyringがクロスプラットフォームの問題をどのように処理するかを確認します(これはpythonライブラリであり、自動検出されたさまざまなキーチェーンバックエンドにプラグインして保存します)

  • GrowlはOSXにバンドルされていないため、個別にインストールする必要があります。OSXには通知システムが組み込まれていません。

  • UNIXの場合、すでに述べたようにDBusにフックすることもできますが(フォールバックとして、dbusはOSXでも使用できることに注意してください)、KDEとGnomeの両方にGrowlに似たライブラリがあります。それぞれ、KDEのKNotificationとGnomeのlibnotify。

  • Windowsの場合、Snarlを確認し、利用できない場合は通知バブルにフォールバックします( ToasterBox の行に沿って何かを使用します)。

通知を固定することを考えてもしないでください。それはばかげている、それは鈍感であり、それはひどく迷惑です。また、あなたのような人のために、ほとんどの通知システムで利用できないようになっています

最後に、これらのいずれにもPython libがない場合でも、ctypesを使用してそれらにアクセスできます。

7
masklinn

サイズを気にしない場合は、 PyQt4 を試してください。

これがこのジョブのクラスです: http://doc.trolltech.com/4.5/qsystemtrayicon.html

3
linjunhalida

必要なように聞こえます Growl for Windows

2

ここに私のために働く簡単なものがあります。トーストは2秒間維持され、消えます。はい、OPは「巨大な」PyQt4を望んでいませんでしたが、これは他の人に役立つかもしれません。

import sys, time
from PyQt4 import QtCore, QtGui
import uiToast

window = None   # global

# Usage: Toast('Message')
class Toast(QtGui.QMainWindow):
    def __init__(self, msg):
        global window               # some space outside the local stack
        window = self               # save pointer till killed to avoid GC
        QtGui.QWidget.__init__(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.ui = uiToast.Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.display.setText(msg)

        self.toastThread = ToastThread()    # start thread to remove display
        self.connect(self.toastThread, QtCore.SIGNAL("finished()"), self.toastDone)
        self.toastThread.start()
        self.show()

    def toastDone(self):
        global window
        window = None               # kill pointer to window object to close it and GC

class ToastThread(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)

    def run(self):
        time.sleep(2.0)             # wait and die

Pyuic4によって作成されたトリミングされたファイル「uiToast.py」は次のとおりです。

from PyQt4 import QtCore, QtGui
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.resize(547, 96)
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 170, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        MainWindow.setPalette(palette)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.display = QtGui.QTextBrowser(self.centralwidget)
        self.display.setGeometry(QtCore.QRect(0, 0, 551, 101))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(255, 170, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        self.display.setPalette(palette)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.display.setFont(font)
        MainWindow.setCentralWidget(self.centralwidget)
1
SoloPilot

勝利時には snarl を使用できます。

Pythonでの使用: www.k23productions.com/e107_plugins/forum/forum_viewtopic.php?2972

0
Dim

優れたクロスプラットフォームサポートのために、私は PyQt を調べます。それはあなたのライブラリにいくつかの重荷を追加しますが、それらはほとんどのねじれをうまく処理しました。

0
tghw