1

我正在编写一个使用 Python 和 Qt 作为 GUI 库的 GUI 应用程序。我想在例如 3 天左右后执行某些预定的操作(但有些更频繁,有些甚至更罕见等)。

我发现了 QTimer() 应用程序,但我的理解是它只在软件运行时跟踪时间。

因此,例如,假设用户选中了每 5 天检查一次自动更新的选项。如果他在第一天运行它,一切都很好。倒计时时钟开始滴答作响。但是如果他在第 6 天第二次运行它,如何确保应用程序确实下载了更新(除了每次将日期写入某个文件并比较两者)?

我希望我足够清楚,如果我不是,请让我知道,我会尽量详细说明。

4

2 回答 2

3

要么你的应用程序必须一直运行,eq。作为 Windows 上的一个小系统托盘图标,或者您需要操作系统定期运行您的应用程序版本以检查更新。

您使用什么操作系统?

编辑:在windows上看到这个答案让你的程序按计划的时间间隔运行如何以编程方式在windows server 2008中创建任务计划程序

于 2012-10-27T02:46:14.523 回答
1

在运行的 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 秒的最后期限,然后再打开。应该说更新过期了。

于 2012-10-27T04:01:02.373 回答