如何使用调度程序在 Pyqt5 中显示弹出消息

Posted

技术标签:

【中文标题】如何使用调度程序在 Pyqt5 中显示弹出消息【英文标题】:How to show popup message in Pyqt5 using scheduler 【发布时间】:2021-09-09 09:27:34 【问题描述】:

我正在开发一个 pyqt5 Trayicon 应用程序,需要添加一个更新功能,我使用 python apscheduler 创建了一个调度程序,该调度程序在后台运行并检查更新。我面临的问题是当更新可用时,我需要显示一个弹出窗口以征得用户同意安装更新,但是每当调用弹出功能时,控制台中都会显示此消息并且应用程序崩溃或停止工作。

NSWindow drag regions should only be invalidated on the Main Thread! This will throw an exception in the future.

我的代码sn-p供参考:

class SystemTrayIcon(QtWidgets.QSystemTrayIcon):

    def __init__(self, icon, parent=None):
    ....
    
    def show_popup(self,message):
        msgBox = QMessageBox()
        msgBox.setIcon(QMessageBox.Information)
        msgBox.setText(message)
        msgBox.setWindowTitle("QMessageBox Example")
        msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
        msgBox.buttonClicked.connect(self.msgButtonClick)

        returnValue = msgBox.exec()
        if returnValue == QMessageBox.Ok:
            return True
        return False

    def startUpdateScheduler(self):
        scheduler = BackgroundScheduler()
        scheduler.add_job(checkUpdate, 'interval', seconds=5)
        scheduler.start()
    
    def checkUpdate(self):
        if(updatesAvailable):
           installUpdates(self.show_popup("DeviceHub updates are available\n Do you want to install?")

【问题讨论】:

【参考方案1】:

问题是 BackgroundScheduler 在辅助线程中执行回调,并且该线程中的 OP 尝试更新 Qt 禁止的 GUI。相反,您应该使用 QtScheduler:

from PyQt5 import QtWidgets
from apscheduler.schedulers.qt import QtScheduler
def startUpdateScheduler(self):
    scheduler = QtScheduler()
    scheduler.add_job(self.checkUpdate, 'interval', seconds=5)
    scheduler.start()

【讨论】:

以上是关于如何使用调度程序在 Pyqt5 中显示弹出消息的主要内容,如果未能解决你的问题,请参考以下文章

QT如何设置程序运行完弹出消息框

如何在颤动的任何屏幕上显示弹出消息?

JAVA咨询 消息框 最小化下能够弹出

python setup.py - 如何在安装后显示消息

如何在 Swift 中显示一条弹出消息,该消息在 3 秒后消失或可以由用户立即取消?

如何在 PyQt5 中用另一个小部件替换一个小部件