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



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

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

我的代码片段供参考:

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 availablen Do you want to install?")

问题是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()

相关内容

  • 没有找到相关文章

最新更新