Кросс-платформенный оповещатель рабочего стола в 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, для простой задачи, такой как это.
Ответы
Ответ 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
для доступа к ним.
Ответ 4
попробуйте PyQt4, если вам не нужен размер.
вот класс для этой работы:
http://doc.trolltech.com/4.5/qsystemtrayicon.html
Ответ 5
Похоже, вам нужно Growl для Windows
Ответ 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. Это добавит немного урона в вашу библиотеку, но они отлично справились с большинством изломов.
Ответ 8
В выигрыше вы можете использовать snarl.
Используя его с python:
www.k23productions.com/e107_plugins/forum/forum_viewtopic.php?2972