Запрос занимает время, поэтому есть 2 возможных решения: запустить его в потоке или использовать QNetworkAccessManager
, который обрабатывает эти запросы асинхронно, поэтому мой ответ будет использовать последнее.Я вижу, что вы используете GitHub API, поэтому, используя документы, я создал класс, который отвечает за получение версии и передачу ее через сигнал.
import json
from pkg_resources import parse_version
from PyQt5 import QtCore, QtWidgets, QtNetwork
# https://developer.github.com/v3/repos/releases/#get-the-latest-release
class LastReleaseGithubHelper(QtCore.QObject):
versionChanged = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
super(LastReleaseGithubHelper, self).__init__(parent)
self.fmt = "https://api.github.com/repos/{owner}/{repo}/releases/latest"
self._manager = QtNetwork.QNetworkAccessManager(self)
self._manager.finished.connect(self.onFinished)
def get_version(self, owner, repo):
url = self.fmt.format(owner=owner, repo=repo)
request = QtNetwork.QNetworkRequest(QtCore.QUrl(url))
self._manager.get(request)
@QtCore.pyqtSlot(QtNetwork.QNetworkReply)
def onFinished(self, reply):
response = reply.readAll().data().decode()
data = json.loads(response)
release_version = data['tag_name']
self.versionChanged.emit(release_version)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self._menu = self.menuBar()
self.permanent_label = QtWidgets.QLabel()
status_bar = self.statusBar()
status_bar.setSizeGripEnabled(False)
status_bar.addWidget(self.permanent_label)
version_helper = LastReleaseGithubHelper(self)
version_helper.versionChanged.connect(self.verify_version)
owner = "efdiloreto"
repo = "Zonda"
version_helper.get_version(owner, repo)
@QtCore.pyqtSlot(str)
def verify_version(self, release_version):
# only test
current_version = '0.0.9'
if parse_version(release_version) > parse_version(current_version):
self.permanent_label.setText('A new version is available!')
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())