1

Python と Qt を GUI ライブラリとして使用して GUI アプリケーションを作成しています。たとえば、3日ほど後に特定のスケジュールされたアクションを実行したいと思います(しかし、いくつかはより頻繁に、いくつかはさらにまれになど)。

QTimer() アプリを発見しましたが、ソフトウェアの実行中の時間を追跡するだけであると理解しています。

たとえば、ユーザーが 5 日ごとに自動更新を確認するオプションをオンにしたとします。彼が初日に実行すれば、すべて問題ありません。カウントダウンの時計が時を刻み始めます。しかし、彼が 6 日目に 2 回目の実行を行った場合、アプリケーションが実際に更新をダウンロードすることを確認するにはどうすればよいでしょうか (毎回ファイルに日付を書き込んで 2 つを比較する以外に)。

私が十分に明確であることを願っています。そうでない場合はお知らせください。さらに詳しく説明します.

4

2 に答える 2

3

アプリを常に実行する必要があります。Windows の小さな systray アイコンとして、または更新を確認するためにアプリのバージョンを定期的に実行するオペレーティング システムが必要です。

使用しているオペレーティング システムは何ですか?

編集:Windowsでは、スケジュールされた間隔でプログラムを実行するには、この回答を参照してください プログラムでWindowsサーバー2008でタスクスケジューラを作成する方法

于 2012-10-27T02:46:14.523 に答える
1

実行中の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秒の期限を過ぎてから、開くことができます。更新が遅れていると表示されます。

于 2012-10-27T04:01:02.373 に答える