Оформление запроса на QMainWindow __init __ () без задержки открытия - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь проверить, доступна ли новая версия программного обеспечения. Вот почему я делаю запрос. Запрос может занять некоторое время и задержать открытие окна.

Должен ли я поместить этот запрос в функцию и вызвать его после загрузки окна? Есть ли способ сделать запрос параллельно?

Я использую Python 3.

Это пример кода:

from urllib import request
import json
from pkg_resources import parse_version
from PyQt5 import QtWidgets
from . import widgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._menu = self.menuBar()
        permanent_label = QtWidgets.QLabel()

        # This request can take some time
        response = request.urlopen('https://api.github.com/repos/efdiloreto/Zonda/releases/latest')
        data = json.load(response)
        actual_version = '0.1.0'
        release_version = data['tag_name']

        if parse_version(release_version) > parse_version(actual_version):
            permanent_label.setText('A new version is available!')

        status_bar = self.statusBar()
        status_bar.setSizeGripEnabled(False)
        status_bar.addWidget(permanent_label)

        self._widget_central = widgets.MainWidget(self)
        self.setCentralWidget(self._widget_central)

1 Ответ

0 голосов
/ 18 сентября 2018

Запрос занимает время, поэтому есть 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...