【问题标题】:How to get the message from a PyQt5 notification message?如何从 PyQt5 通知消息中获取消息?
【发布时间】:2019-02-10 09:05:32
【问题描述】:

我想使用 PyQt5 编写一个包含各种通知消息的应用程序。 当用户点击它时,是否可以从气球消息中获取文本?

我编写了一个示例代码来模拟我的问题。一个线程每 10 秒发送一次信号。发送信号时,会弹出两种类型的消息。当用户点击消息tray_msg_clicked 时,方法激活。但这就是我坚持的地方。我无法识别消息是什么。

from PyQt5 import QtCore, QtWidgets
from time import sleep


class Ui_MainWindow(QtWidgets.QMainWindow):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1218, 502)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(827, 500))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.mythread = ExecuteThread()
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.initUI()

    def initUI(self):
        self.tray()
        self.start_thread()

    def start_thread(self):
        self.mythread.start()
        self.mythread.my_signal.connect(self.thread_signal)

    def thread_signal(self, msg):
        if msg == "message1":
            self.tray_icon.showMessage("Message1", "This is message one.",
                                       QtWidgets.QSystemTrayIcon.Information, 5000)
        elif msg == "message2":
            self.tray_icon.showMessage("Message2", "This is message two.",
                                       QtWidgets.QSystemTrayIcon.Information, 5000)

    def tray_msg_clicked(self):
        print("Tray message clicked!")
        tray_msg = ""
        if tray_msg == "This is message one.":
            print("'Message one' code activated.")
            # Some code
        elif tray_msg == "This is message two.":
            print("'Message two' code activated.")
            # Some code

    def tray(self):
        self.tray_icon = QtWidgets.QSystemTrayIcon(self)
        self.tray_icon.messageClicked.connect(self.tray_msg_clicked)
        self.tray_icon.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_ComputerIcon))
        tray_menu = QtWidgets.QMenu()
        self.tray_icon.setContextMenu(tray_menu)
        self.tray_icon.show()


class ExecuteThread(QtCore.QThread):
    my_signal = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(ExecuteThread, self).__init__(parent)

    def run(self):
        while True:
            self.my_signal.emit("message1")
            sleep(10)
            self.my_signal.emit("message2")
            sleep(10)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

有人有任何想法或解决方法来识别这些通知消息中的文本吗?感谢您的帮助!

【问题讨论】:

  • 我会说,从你得到它的任何地方保存消息。如果某些东西最终出现在 GUI 中 - 这通常意味着您以某种方式生成了它。这意味着,当您生成它时 - 将数据保存到您可以更轻松地访问/使用它的地方。
  • 如果没有其他选择,那么这是个好主意!谢谢!
  • 这是可能的,但它可能更费力且更慢。对 Qt 了解不足,无法真正提供帮助。我可以把print(dir(self.tray_icon))print(self.tray_icon.__dict__) 留给你,看看你准备了哪些函数/变量。

标签: python notifications pyqt5 message balloon


【解决方案1】:

负责显示此消息的模块是没有公共接口的 QBalloonTip 类,所以不幸的是,这在 python 中不可用。

https://code.woboq.org/qt5/qtbase/src/widgets/util/qsystemtrayicon_p.h.html#QBalloonTip

尝试修改 QSystemTrayIcon 实例的 toolTip 属性或引入一个新变量与上一条消息的文本。

【讨论】:

  • 哦,这很不幸。谢谢你的信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
相关资源
最近更新 更多