【问题标题】:Check something at regular intervals in a Python (Qt) application在 Python (Qt) 应用程序中定期检查某些内容
【发布时间】:2012-10-27 02:13:56
【问题描述】:

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

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

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

我希望我足够清楚,如果我还不够清楚,请告诉我,我会尽量详细说明。

【问题讨论】:

    标签: python qt pyqt scheduled-tasks pyside


    【解决方案1】:

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

    您使用的是什么操作系统?

    编辑:在 Windows 上查看此答案以让您的程序按预定时间间隔运行Programmitically how to create task scheduler in windows server 2008

    【讨论】:

    • 感谢您的回复。该应用程序将仅在 Windows 上可用。那么在运行应用程序时编写当前日期时间是一个好主意,并在第二次运行时比较两个日期时间?这也是我需要用于其他东西的任务调度吗?
    • 是的,最好的方法就是检查每次启动,例如。如果超过一天 - 然后检查您的网站。我认为我从未使用过的某些应用程序一直在运行检查我不关心的更新的任务是不礼貌的
    • 我会留下让应用程序在应用程序未运行时执行计划任务的选项给用户 - 事实上,用户有显示“启用计划任务”的设置菜单。感谢您一直以来的帮助。我会再等一会儿,然后我会将您的答案标记为已接受。
    【解决方案2】:

    在运行的 PyQt 应用程序之外创建调度程序有点超出 PyQt 本身的范围,并且取决于平台。除非您创建第二个应用程序,该应用程序在系统托盘中严格作为 Qt.WindowSystemMenuHint 运行,并且实际执行与您的主应用程序分开的更新。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-14
      • 2011-10-11
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多