Кросс-платформенный настольный уведомитель в Python - PullRequest
46 голосов
/ 11 февраля 2010

Я ищу Growl -подобную библиотеку уведомлений в виде всплывающих подсказок Windows в Python. Представьте, что вы пишете код вроде:

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

.. и это уведомит соответствующими подсказками на Mac, Windows и Linux. Существует ли такая библиотека? Если нет, то как бы я сам написал?

  • Mac поставляется с уведомителем по умолчанию? Growl - это то, что я должен установить отдельно?
  • В Windows я предполагаю, что для этого может потребоваться pywin32 ?
  • В Linux, при условии использования GNOME, существует ли API-интерфейс GNOME (использующий gnome-python), который делает это?
  • Могу ли я сделать уведомления «липкими» (т.е. никогда не исчезать) на всех платформах?

Обновление : я предпочитаю, чтобы , а не зависело от гигантских структур GUI, таких как PyQT4 и wxPython, для простой задачи, такой как эта.

Ответы [ 8 ]

19 голосов
/ 11 февраля 2010

Вот уведомитель для рабочего стола, который я написал несколько лет назад, используя wxPython - он ведет себя одинаково в Windows и Linux и должен также работать в OSX. Он содержит многопоточный цикл событий, который можно использовать для анимации окна уведомлений, содержащего значок и сообщение, по которому можно щелкнуть. Вероятно, потребуется несколько настроек, чтобы настроить его для своих собственных целей, но земляная работа сделана.

17 голосов
/ 16 августа 2011

На Pycon 2010 была презентация по кроссплатформенной разработке Python . Об этом также была html-страница, содержащая некоторые советы для кроссплатформенного уведомления. Однако я больше не нахожу его в Интернете, но я сохранил локальную копию, и это часть уведомлений:

В некоторых случаях ваше приложение хочет уведомить пользователя о чем-то: обновления программного обеспечения доступны, новое мгновенное сообщение работа завершена, задание на печать на 300 страницах и т. д.

  • Для упрощения переноса уведомлений на кроссплатформенные они интерактивные. Например, Ubuntu не поддерживает уведомления которые требуют взаимодействия с пользователем.
  • Это наиболее важные библиотеки:

    o Linux: pynotify .

    o Mac OS X: Growl, который не является стандартным, обычно установлен.

    o Windows: хорошее решение для wxPython - ToasterBox от Andrea Гавана, которая имитирует внешний вид уведомлений Firefox или Thunderbird.

  • Для Phatch мы разработали библиотеку, которая объединяет эти три системы в одном API: phatch / lib / notify.py .

Связанный файл Python очень интересен, и я думаю, что вы сможете использовать связанный файл Python почти как есть. Код также очень понятен, поэтому вы быстро увидите, что он делает.

Основной подход заключается в том, что он определяет, какие системы уведомлений доступны практически независимо от платформы, и пытается использовать их в определенном порядке, но при необходимости прибегает к более простым системам. Таким образом, если пользователь имеет, например, Установленный Growl будет использовать его независимо от платформы.

Вы можете адаптировать его для поддержки других систем уведомлений, кроме трех, упомянутых выше.

7 голосов
/ 11 февраля 2010
  • Как написать это

    Проверьте, как keyring решает кросс-платформенные проблемы (это библиотека Python, которая подключается к различным автоматически определяемым брелкам цепочки для ключей для хранения)

  • Growl не входит в комплект OSX, его нужно установить отдельно, OSX не поставляется с какой-либо встроенной системой уведомлений.

  • Для юниксов вы можете подключиться к DBus, как уже упоминалось (в качестве отступления, обратите внимание, что dbus также может быть доступен в OSX), но и KDE, и Gnome имеют Growl-подобные библиотеки. Соответственно, KNotification для KDE и libnotify для Gnome.

  • Для окон проверьте Snarl, откройте пузырьки уведомлений, если они недоступны (используя что-то вроде ToasterBox )

Не никогда даже подумайте о том, чтобы делать уведомления липкими. Это глупо, нечувствительно и чертовски раздражает. Кроме того, благодаря таким людям, как вы, он стал не доступным в большинстве систем уведомлений.

Наконец, даже если для каких-либо из них нет Python-библиотеки, вы, вероятно, можете использовать ctypes для доступа к ним.

3 голосов
/ 12 февраля 2010

попробуйте PyQt4 , если вам не важен размер.

вот класс для этой работы: http://doc.trolltech.com/4.5/qsystemtrayicon.html

2 голосов
/ 13 июля 2010

Звучит так, как вам нужно рычание для Windows

1 голос
/ 09 февраля 2014

Вот кое-что простое, что работает для меня.Тост остается на 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

Урезанный файл «uiToast.py», созданный pyuic4, выглядит так:

0 голосов
/ 11 февраля 2010

На выигрыш вы можете использовать snarl .

Использование его с python: www.k23productions.com / e107_plugins / форум / forum_viewtopic.php? 2972 ​​

0 голосов
/ 11 февраля 2010

Для хорошей кроссплатформенной поддержки я бы посмотрел на PyQt . Это добавит немного здоровья в вашу библиотеку, но они хорошо поработали над большинством изломов.

...