2010-02-10 21 views
46

Tôi đang tìm kiếm Growl giống như thư viện thông báo về bong bóng trong Windows bằng Python. Hãy tưởng tượng viết mã như:Trình thông báo trên màn hình nền đa năng trong Python

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

.. và điều đó sẽ thông báo với các chú giải công cụ tương ứng trên Mac, Windows và Linux. Thư viện đó có tồn tại không? Nếu không, làm thế nào tôi sẽ đi về viết một bản thân mình?

  • Mac có đi kèm trình thông báo mặc định không? Có phải Growl điều gì đó mà tôi nên cài đặt riêng không?
  • Trên Windows, tôi cho rằng điều này có thể yêu cầu pywin32?
  • Trên Linux, giả sử GNOME, có một API GNOME (sử dụng gnome-python) thực hiện điều này không?
  • Tôi có thể làm cho thông báo 'dính' (tức là, không phai mờ) trên tất cả các nền tảng không?

Cập nhật: Sở thích của tôi là để không phụ thuộc vào khuôn khổ GUI khổng lồ như PyQT4 và wxPython cho một nhiệm vụ đơn giản như thế này.

+2

Lưu ý rằng trên OSX, có một notifier mặc định ngay bây giờ và Growl đã trở thành thương mại (và do đó chủ yếu là phi tiêu chuẩn). Xem [tại đây] (http://stackoverflow.com/questions/11814903/send-notification-to-mountain-lion-notification-center). Hoặc [ở đây] (https://github.com/albertz/music-player/blob/master/notifications.py) để triển khai Python. – Albert

Trả lời

0

Để có hỗ trợ đa nền tảng tốt, tôi sẽ xem PyQt. Nó sẽ bổ sung thêm một số thư viện vào thư viện của bạn, nhưng họ đã làm tốt công việc của mình.

+0

PyQT là quá nhiều cho yêu cầu đơn giản của tôi. Bên cạnh đó, việc triển khai các ứng dụng với PyQT là một * đau *: http://arstechnica.com/open-source/guides/2009/03/how-to-deploying-pyqt-applications-on-windows-and-mac-os- x.ars –

7
  • Làm thế nào để đi về cách viết nó

    Kiểm tra như thế nào keyring xử lý các vấn đề cross-platform (đó là một thư viện python mà cắm vào backends keychain autodetected khác nhau cho lưu trữ)

  • Growl không đi kèm với OSX mà bạn phải cài đặt riêng, OSX không có bất kỳ hệ thống thông báo tích hợp nào.

  • Đối với unix, bạn có thể muốn móc vào DBus như đã đề cập (như dự phòng, lưu ý rằng dbus cũng có thể có sẵn trong OSX), nhưng cả KDE và Gnome đều có thư viện Growl. Tương ứng, KNotification cho KDE và libnotify cho Gnome.

  • Đối với cửa sổ, hãy kiểm tra tiếng gầm gừ, rơi trở lại để thông báo bong bóng nếu không có sẵn (sử dụng một cái gì đó dọc theo dòng của ToasterBox)

Do không bao giờ thậm chí nghĩ đến việc thông báo dính. Đó là ngu ngốc, nó không nhạy cảm và nó gây khó chịu. Ngoài ra, do những người như bạn, nó đã được thực hiện không phải có sẵn trong hầu hết các hệ thống thông báo.

Cuối cùng, ngay cả khi không có lib Python cho bất kỳ điều nào trong số này, bạn có thể sử dụng ctypes để truy cập chúng.

+0

đây chính là cách tôi sẽ tiếp cận điều này nếu không có mô-đun cho nó. upvoted cho đọc tâm trí. bây giờ chỉ có ai đó cần phải mã hóa nó ... PS: tôi cá nhân sử dụng bong bóng của Qt như dự phòng ở khắp mọi nơi mặc dù. Chúng rất xấu, nhưng mọi ứng dụng GUI tôi viết đều sử dụng qt, vì vậy ít nhất nó luôn có sẵn. –

+2

"* OSX không có bất kỳ hệ thống thông báo tích hợp nào *" không đúng cho các phiên bản OSX mới nhất. –

19

Here's a desktop notifier I wrote a few years ago using wxPython - nó hoạt động giống nhau trên Windows và Linux và cũng nên chạy trên OSX.Nó chứa một vòng lặp sự kiện luồng có thể được sử dụng để tạo hiệu ứng một cửa sổ thông báo có chứa một biểu tượng và thông báo có thể được nhấp vào. Nó có thể cần một vài tinh chỉnh để tùy chỉnh nó cho mục đích của riêng bạn nhưng công việc mặt đất được thực hiện.

+3

Giấy phép nào được phát hành theo? Edit: Nevermind ... đó là một loại giấy phép BSD ... cảm ơn bạn đã phát hành mã như vậy. Đó là một nỗi đau để tìm thư viện hoặc những điều tôi muốn TÌM HIỂU từ đó sẽ không có nguy cơ bất kỳ phiên bản tương lai của mã của tôi. Nhưng tôi không có vấn đề gì khi tín dụng đến hạn;) – ThantiK

+0

dự án này được chuyển đến https://github.com/stephenmcd/readertray – tc88

17

Tại Pycon 2010 là có một presentation on cross-platform Python development. Có một trang html về nó, có chứa một số lời khuyên cho thông báo đa nền tảng. Tuy nhiên, tôi không tìm thấy nó trên mạng nữa, nhưng tôi lưu một bản sao cục bộ, và đây là một phần trên thông báo:

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 .

Các file python liên kết là rất thú vị, và tôi nghĩ rằng bạn sẽ có thể sử dụng tệp python được liên kết gần như là. Mã này cũng rất rõ ràng, vì vậy bạn sẽ nhanh chóng thấy nó làm gì.

Cách tiếp cận cơ bản là phát hiện hệ thống thông báo nào có sẵn, hầu như bất kể nền tảng và cố gắng sử dụng chúng theo một thứ tự nhất định nhưng lại quay trở lại các hệ thống đơn giản hơn nếu cần. Bằng cách này, nếu người dùng có ví dụ: Growl cài đặt nó sẽ sử dụng nó, bất kể nền tảng.

Bạn có thể điều chỉnh nó để cung cấp hỗ trợ cho các hệ thống thông báo khác so với ba được đề cập ở trên.

+1

Tôi không biết tại sao câu trả lời này không có nhiều upvotes hơn. Nó hoạt động rất tốt ngay trong hộp và rất dễ hiểu. –

+1

Đã thử notify.py. Nó cần được cập nhật với 'import other.pyWx.toasterbox' →' nhập wx.lib.agw.toasterbox thành TB', tôi tin. Nhưng nó vẫn không làm bất cứ điều gì: 'send ('title', 'message')' → 'PyNoAppError: Đối tượng wx.App phải được tạo đầu tiên!' – endolith

+0

Về cơ bản tôi có các ứng dụng không có cửa sổ và tôi muốn nói 'bóng' ('cái gì đó')' thay vì 'in (' cái gì đó ') '. Tại sao chúng ta phải trải qua tất cả các rắc rối của việc tạo ra và phá hủy các cửa sổ và các công cụ chỉ để bật lên hộp thoại hoặc bóng bay? http://stackoverflow.com/q/1635027/125507 – endolith

1

Đây là điều đơn giản phù hợp với tôi. Bánh mì nướng ở lại trong 2 giây và biến mất. Có, OP không muốn 'PyQt4 khổng lồ', nhưng điều này có thể hữu ích cho người khác.

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 

Các tỉa xuống tập tin 'uiToast.py' tạo bởi pyuic4 là:

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) 
Các vấn đề liên quan