在运行的 PyQt 应用程序之外创建调度程序有点超出 PyQt 本身的范围,并且依赖于平台。除非您创建第二个应用程序,该应用程序严格作为Qt.WindowSystemMenuHint
系统托盘中的 a 运行,并且实际执行与主应用程序分开的更新。
因此,这里有一个将更新记录在QSettings
. 每次应用程序加载时,它都会检查上次更新发生的时间,以及我们是否逾期或剩余时间。如果还有时间,计时器将根据差异进行适当调整:
from PyQt4 import QtGui, QtCore
class Window(QtGui.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.resize(150,150)
self._update_secs = 30
self.button = QtGui.QPushButton("Update")
self.button.setFixedSize(100,100)
self.setCentralWidget(self.button)
self.button.clicked.connect(self.doUpdate)
self._loadSettings()
def _loadSettings(self):
self._settings = QtCore.QSettings("mycompany", "myapp")
# checkpoint = self._settings.value('checkpoint')
lastUpdate = self._settings.value('lastUpdate')
now = QtCore.QDateTime.currentDateTimeUtc()
# update_time = 60*60*24*5
secs = self._update_secs
if not lastUpdate.isNull():
secs = abs(lastUpdate.toDateTime().secsTo(now))
if secs >= self._update_secs:
print "Update is past due at load time"
self.doUpdate()
return
else:
print "Still %d seconds left from last load, until next update" % secs
self._startUpdateTimer(secs)
def doUpdate(self):
print "performing update!"
now = QtCore.QDateTime.currentDateTimeUtc()
self._settings.setValue("lastUpdate",now)
self._startUpdateTimer(self._update_secs)
def _startUpdateTimer(self, secs):
print "Starting update timer for %d seconds" % secs
try:
self._updateTimer.stop()
except:
pass
self._updateTimer = QtCore.QTimer()
self._updateTimer.timeout.connect(self.doUpdate)
self._updateTimer.start(secs*1000)
if __name__ == "__main__":
app = QtGui.QApplication([])
win = Window()
win.show()
app.exec_()
您可以尝试加载它,稍后关闭它,然后重新加载它。它应该报告还有时间。一旦发生更新,您可以将其关闭并等待超过 30 秒的最后期限,然后再打开。应该说更新过期了。