実行中のPyQtアプリの外部でスケジューラーを作成することは、PyQt自体の範囲外であり、プラットフォームに依存します。Qt.WindowSystemMenuHint
システムトレイで厳密に実行され、実際にメインアプリとは別に更新を実行する2番目のアプリを作成しない限り。
したがって、これは更新をに記録するものの例です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秒の期限を過ぎてから、開くことができます。更新が遅れていると表示されます。