2010-02-10 5 views
46

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

Update: Я предпочитаю не зависят от гигантских рамок GUI, как PyQt4 и WxPython для простой задачи, такие как это.

+2

Обратите внимание, что на OSX, есть Уведомитель по умолчанию сейчас и Growl стал коммерческим (и, таким образом, в основном нестандартное). См. [Здесь] (http://stackoverflow.com/questions/11814903/send-notification-to-mountain-lion-notification-center). Или [здесь] (https://github.com/albertz/music-player/blob/master/notifications.py) для реализации Python. – Albert

ответ

0

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

+0

PyQT слишком много для моего простого требования. Кроме того, развертывание приложений с PyQT - это * боль *: http://arstechnica.com/open-source/guides/2009/03/how-to-deploying-pyqt-applications-on-windows-and-mac-os- x.ars –

7
  • Как идти о написании его

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

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

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

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

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

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

+0

Это именно то, как я подходил бы к этому, если для него нет модуля. для чтения ума. теперь только кому-то нужно его закодировать ... PS: я лично использовал бы пузыри Qt как везде. Они уродливые, но каждое приложение GUI, которое я пишу, использует qt, поэтому оно по крайней мере всегда доступно. –

+2

«* OSX не поставляется с какой-либо встроенной системой уведомлений *» не соответствует последним версиям OSX. –

19

Here's a desktop notifier I wrote a few years ago using wxPython - он идентично относится к Windows и Linux, а также должен работать на OSX.Он содержит поточный цикл событий, который можно использовать для анимации окна уведомления, содержащего значок и сообщение, на которое можно нажать. Возможно, потребуется несколько настроек, чтобы настроить его для ваших собственных целей, но основная работа выполнена.

+3

Какая лицензия выдается под? Изменить: Nevermind ... это тип лицензии BSD ... спасибо за то, что вы выпустили код как таковой. Это боль, чтобы найти библиотеки или вещи, которые я хочу ИЗВЕСТИЮ, из которых не будет угрожать будущим выпускам моего кода. Но у меня нет проблем с предоставлением кредита, в котором должен быть предоставлен кредит;) – ThantiK

+0

этот проект перенесен на https://github.com/stephenmcd/readertray – tc88

17

В PyCon 2010 был presentation on cross-platform Python development. Также была страница html, содержащая несколько советов для межплатформенного уведомления. Тем не менее, я не нахожу его в Интернете больше, но я сохранил локальную копию, и это часть на уведомлениях:

There are occasions in which your application wants to notify the user about something: software updates are available, a new instant message have been received, the 300 page print job has finally finished, etc.

  • To keep notifications easy to port cross-platform, don't make them interactive. For example Ubuntu does not support notifications that require user interaction.
  • These are the most important libraries:

    o Linux: pynotify .

    o Mac OS X: Growl, which is not standard, is usually installed.

    o Windows: a good wxPython solution is ToasterBox of Andrea Gavana, which mimics the look of Firefox or Thunderbird notifications.

  • For Phatch we developed a library that unifies these three systems in one API: phatch/lib/notify.py .

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

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

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

+1

Я не знаю, почему этот ответ не имеет больше оборотов. Он отлично справился с задачей, и его очень легко понять. –

+1

Пробовал notify.py. Я думаю, он должен быть обновлен с помощью 'import other.pyWx.toasterbox' →' import wx.lib.agw.toasterbox как TB'. Но он все равно ничего не делает: 'send ('title', 'message')' → 'PyNoAppError: сначала должен быть создан объект wx.App!' – endolith

+0

По существу у меня есть приложения без окон, и я хочу сказать' balloon ('something') 'вместо' print ('something') '. Почему нам приходится сталкиваться с трудностями при создании и уничтожении окон и всего лишь всплывающих диалогов или воздушных шаров? http://stackoverflow.com/q/1635027/125507 – endolith

1

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