Кросс-платформенный настольный уведомитель на Python

Я ищу 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), который делает это?
  • Могу ли я сделать уведомления «липкими» (т. Е. Никогда не исчезать) на всех платформах?

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


person Sridhar Ratnakumar    schedule 10.02.2010    source источник
comment
Обратите внимание, что в OSX теперь есть уведомитель по умолчанию, и Growl стал коммерческим (и, следовательно, в основном нестандартным). См. здесь. Или здесь для реализации Python.   -  person Albert    schedule 02.09.2012


Ответы (8)


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

person Stephen McDonald    schedule 11.02.2010
comment
Под какой лицензией это выпущено? Edit: Nevermind ... это тип лицензии BSD ... спасибо за то, что выпустили код как таковой. Больно находить библиотеки или вещи, из которых я хочу УЧИТЬСЯ, которые не будут подвергать риску будущие выпуски моего кода. Но у меня нет проблем с предоставлением кредита там, где он должен быть;) - person ThantiK; 11.02.2010
comment
похоже, что эта ссылка мертва! это случайно не на GitHub? заранее спасибо - person naruto-sfdc; 22.03.2020

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

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

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

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

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

person Rabarberski    schedule 16.08.2011
comment
Я не знаю, почему этот ответ не набрал больше голосов. Он отлично работал прямо из коробки, и его очень легко понять. - person Dan Hlavenka; 25.01.2012
comment
Пробовал notify.py. Я считаю, что его нужно обновить с помощью import other.pyWx.toasterboximport wx.lib.agw.toasterbox as TB. Но по-прежнему ничего не делает: send('title','message')PyNoAppError: The wx.App object must be created first! - person endolith; 14.03.2012
comment
По сути, у меня есть приложения без окон, и я хочу сказать balloon('something') вместо print('something'). Почему мы должны проходить через все проблемы создания и уничтожения окон и прочего только для того, чтобы открывать диалоговые окна или воздушные шары? stackoverflow.com/q/1635027/125507 - person endolith; 14.03.2012

  • Как приступить к написанию

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

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

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

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

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

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

person masklinn    schedule 11.02.2010
comment
именно так я бы подошел к этому, если бы для этого не было модуля. проголосовали за чтение мыслей. теперь только кому-то нужно его кодировать ... PS: я бы лично использовал пузыри Qt как запасной вариант везде. Они уродливы, но каждое приложение с графическим интерфейсом, которое я пишу, использует qt, поэтому оно, по крайней мере, всегда доступно. - person flying sheep; 31.07.2011
comment
OSX не имеет встроенной системы уведомлений, что не соответствует последним версиям OSX. - person om-nom-nom; 11.01.2013

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

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

person linjunhalida    schedule 12.02.2010

Похоже, вам нужен Growl для Windows

person Cristian Lupascu    schedule 13.07.2010

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

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)
person SoloPilot    schedule 09.02.2014

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

person tghw    schedule 11.02.2010
comment
PyQT - это слишком много для моего простого требования. Кроме того, развертывание приложений с PyQT - это боль: arstechnica.com/open-source/guides/2009/03/ - person Sridhar Ratnakumar; 11.02.2010

В случае победы вы можете использовать snarl.

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

person Dim    schedule 11.02.2010