как запустить загрузку заставки при записи в базу данных - PullRequest
1 голос
/ 23 июня 2019

как запустить загрузку диалога при записи программы в базу данных

class windows_gui(QMainWindow):
    def __init__(self):
        super(windows_gui, self).__init__()
        self.setGeometry(200 , 200 ,500 ,500)
        button = QPushButton("Open window" , self)
        button.clicked.connect(self.change_dial)


    def change_dial(self):
        self._thread = QThread(self)  # Move to thread to execute
        self._thread.started.connect(self.loading_window_fun)

    def loading_window_fun(self):
        try :
            gif = os.path.join('system' , 'icons' , 'loading.gif')
            self.loding_window = QDialog()
            self.loding_window.setWindowFlags(Qt.WindowFlags(Qt.SplashScreen) )
            self.loding_window.setStyleSheet("border: 0px;")


            self.movie = QMovie(gif, QByteArray(), self.loding_window )
            self.movie_screen = QLabel()
            self.movie_screen.setStyleSheet("border: 0px;")
            self.movie_screen.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
            self.movie_screen.setAlignment(Qt.AlignCenter)
            self.movie_screen.setFixedWidth(500)
            self.movie_screen.setFixedHeight(500)

            main_layout = QVBoxLayout()
            self.loding_window.setLayout(main_layout)
            main_layout.addWidget(self.movie_screen)
            self.movie.setCacheMode(QMovie.CacheAll)
            self.movie_screen.setMovie(self.movie)
            self.movie.start()
            self.movie.loopCount()


            self.loding_window.exec_()
        except Exception as e :
            print(e)

    def wirtetodb(self):
        for i in range(100):
            print(i)

1 Ответ

0 голосов
/ 23 июня 2019

Если вы собираетесь использовать заставку при выполнении задачи, тогда эта задача должна занимать не менее 1 секунды, если менее вероятно, что пользователь не сможет увидеть, как быстро окно будет открываться и закрываться. Учитывая вышесказанное, эта задача должна выполняться в другом потоке, поэтому я создал объект QObject, который излучает сигнал до и после выполнения задачи, эти сигналы служат для отображения и закрытия окна.

import os
from PyQt5 import QtCore, QtGui, QtWidgets


class DatabaseWorker(QtCore.QObject):
    started = QtCore.pyqtSignal()
    finished = QtCore.pyqtSignal()

    @QtCore.pyqtSlot()
    def writeToDatabase(self):
        self.started.emit()
        for i in range(100):
            QtCore.QThread.msleep(10)
            print(i)
        self.finished.emit()


class Windows_GUI(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setGeometry(200, 200, 500, 500)
        button = QtWidgets.QPushButton("Open window")
        self.setCentralWidget(button)
        thread = QtCore.QThread(self)
        thread.start()
        self.m_database_worker = DatabaseWorker()
        self.m_database_worker.moveToThread(thread)
        self.m_database_worker.started.connect(self.start_animation)

        button.clicked.connect(self.m_database_worker.writeToDatabase)

    @QtCore.pyqtSlot()
    def start_animation(self):

        gif_path = os.path.join("system", "icons", "loading.gif")
        self.loading_window = QtWidgets.QDialog()
        self.loading_window.setWindowFlags(QtCore.Qt.SplashScreen)
        self.loading_window.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        movie = QtGui.QMovie(gif_path, cacheMode=QtGui.QMovie.CacheAll)

        movie_label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
        movie_label.setStyleSheet("border: 0px;")
        movie_label.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
        )
        movie_label.setFixedSize(500, 500)
        movie_label.setMovie(movie)

        vbox = QtWidgets.QVBoxLayout(self.loading_window)
        vbox.addWidget(movie_label)
        self.m_database_worker.finished.connect(self.loading_window.close)
        self.loading_window.show()
        movie.start()


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = Windows_GUI()
    w.show()
    sys.exit(app.exec_())

Обновление:

import os
from functools import partial
from PyQt5 import QtCore, QtGui, QtWidgets


class DatabaseWorker(QtCore.QObject):
    started = QtCore.pyqtSignal()
    finished = QtCore.pyqtSignal()

    @QtCore.pyqtSlot(object)
    def writeToDatabase(self, value):
        self.started.emit()
        for i in range(value):
            QtCore.QThread.msleep(10)
            print(i)
        self.finished.emit()


class Windows_GUI(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        # ...
        self.m_database_worker = DatabaseWorker()
        self.m_database_worker.moveToThread(thread)
        self.m_database_worker.started.connect(self.start_animation)

        button.clicked.connect(self.on_clicked)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        value = 1000
        wrapper = partial(self.m_database_worker.writeToDatabase, value)
        QtCore.QTimer.singleShot(0, wrapper)

    # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...