Подтвердить что ты не робот

Кросс-платформенный оповещатель рабочего стола в Python

Я ищу Growl-like, библиотеку уведомлений на основе аэростатов 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, для простой задачи, такой как это.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

    o Linux: pynotify.

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

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

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

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

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

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

Ответ 3

  • Как это сделать

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

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

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

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

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

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

Ответ 6

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

Ответ 7

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