Не работает таймер в QLable

Я хочу сделать таймер в своей программе, написал логику работу, а вот с выводом в lable возникли проблемы. Если запустить программу, то в cmd будет выводится время, а интерфейс не загрузится. Как это решить?

main.py

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from oge import Ui_MainWindow
from PyQt5.Qt import *
from datetime import datetime, timedelta
import time
import rsa
import base64
import os

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()

        self.setupUi(self)

        self.setWindowTitle("Automatic OGE verification system ver.00.09.56")

        (self.key_pub, self.key_priv) = rsa.newkeys(512)

        self.pushButton.clicked.connect(self.information)
        
        self.time()

    def time(self):
        beg = datetime.strptime(str('01:59:59'), '%H:%M:%S')
        end = datetime.strptime(str('00:00:00'), '%H:%M:%S')
        step = timedelta(seconds=1)
        while beg != end:
            beg = beg - step
            print(str(beg).split()[1])
            self.lable_55.setText(str(beg).split()[1])
            time.sleep(1)

    def information(self):
        self.dd_mm_yy = self.lineEdit_6.text()
        self.region = self.lineEdit_7.text()
        self.code_eo = self.lineEdit_8.text()
        self.number_class = self.lineEdit_9.text()
        self.letter_class = self.lineEdit_13.text()
        self.code_location_event = self.lineEdit_14.text()
        self.number_auditorium = self.lineEdit_15.text()
        self.number_option = self.lineEdit_16.text()
        self.code_subject = self.lineEdit_17.text()
        self.item_name = self.lineEdit_18.text()
        self.number_kim = self.lineEdit_19.text()

        self.surname = self.lineEdit.text()
        self.name = self.lineEdit_2.text()
        self.patronymic = self.lineEdit_3.text()
        self.ser_passport = self.lineEdit_5.text()
        self.number_passport = self.lineEdit_4.text()

        sequences = (
            self.dd_mm_yy, self.region, self.code_eo, self.number_class, self.letter_class, self.code_location_event,
            self.number_auditorium, self.number_option, self.code_subject, self.item_name, self.number_kim,
            self.surname, self.name, self.patronymic, self.ser_passport, self.number_passport
        )

        if all(len(x) > 0 for x in sequences):
            if not os.path.exists('key_pub.pem'):
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Warning)
                msg.setText("Ошибка")
                msg.setInformativeText('ВНИМАНИЕ! В директории программы не обнаружен файл: "key_pub.pem"'
                                       'Обратитесь к техническому специалисту')
                msg.setWindowTitle("Ошибка")
                msg.exec_()
                return

            with open('key_pub.pem', "rb") as f:
                _key_pub = f.read()

            key_pub = self.key_pub.load_pkcs1(_key_pub)

            self.key_task(key_pub)
        else:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText("Ошибка")
            msg.setInformativeText('ВНИМАНИЕ! Обязательные поля данных не заполненны.'
                                   'Заполните их для завершения работы.'
                                   'Обратитесь к техническому специалисту')
            msg.setWindowTitle("Ошибка")
            msg.exec_()

    def key_task(self, key_pub):
        self.number_1 = self.lineEdit_20.text()
        self.number_2 = self.lineEdit_22.text()
        self.number_3 = self.lineEdit_21.text()
        self.number_4 = self.lineEdit_23.text()
        self.number_5 = self.lineEdit_24.text()
        self.number_6 = self.lineEdit_25.text()
        self.number_7 = self.lineEdit_26.text()
        self.number_8 = self.lineEdit_27.text()
        self.number_9 = self.lineEdit_28.text()
        self.number_10 = self.lineEdit_29.text()
        self.number_11 = self.lineEdit_30.text()
        self.number_12 = self.lineEdit_31.text()

        self.key_task_crypto(key_pub)

    def key_task_crypto(self, key_pub):
        self.number_1_crypto = rsa.encrypt(self.number_1.encode('utf8'), key_pub)
        self.number_2_crypto = rsa.encrypt(self.number_2.encode('utf8'), key_pub)
        self.number_3_crypto = rsa.encrypt(self.number_3.encode('utf8'), key_pub)
        self.number_4_crypto = rsa.encrypt(self.number_4.encode('utf8'), key_pub)
        self.number_5_crypto = rsa.encrypt(self.number_5.encode('utf8'), key_pub)
        self.number_6_crypto = rsa.encrypt(self.number_6.encode('utf8'), key_pub)
        self.number_7_crypto = rsa.encrypt(self.number_7.encode('utf8'), key_pub)
        self.number_8_crypto = rsa.encrypt(self.number_8.encode('utf8'), key_pub)
        self.number_9_crypto = rsa.encrypt(self.number_9.encode('utf8'), key_pub)
        self.number_10_crypto = rsa.encrypt(self.number_10.encode('utf8'), key_pub)
        self.number_11_crypto = rsa.encrypt(self.number_11.encode('utf8'), key_pub)
        self.number_12_crypto = rsa.encrypt(self.number_12.encode('utf8'), key_pub)

        self.dd_mm_yy_crypto = rsa.encrypt(self.dd_mm_yy.encode('utf8'), key_pub)
        self.region_crypto = rsa.encrypt(self.region.encode('utf8'), key_pub)
        self.code_eo_crypto = rsa.encrypt(self.code_eo.encode('utf8'), key_pub)
        self.number_class_crypto = rsa.encrypt(self.number_class.encode('utf8'), key_pub)
        self.letter_class_crypto = rsa.encrypt(self.letter_class.encode('utf8'), key_pub)
        self.code_location_event_crypto = rsa.encrypt(self.code_location_event.encode('utf8'), key_pub)
        self.number_auditorium_crypto = rsa.encrypt(self.number_auditorium.encode('utf8'), key_pub)
        self.number_option_crypto = rsa.encrypt(self.number_option.encode('utf8'), key_pub)
        self.code_subject_crypto = rsa.encrypt(self.code_subject.encode('utf8'), key_pub)
        self.item_name_crypto = rsa.encrypt(self.item_name.encode('utf8'), key_pub)
        self.number_kim_crypto = rsa.encrypt(self.number_kim.encode('utf8'), key_pub)

        self.surname_crypto = rsa.encrypt(self.surname.encode('utf8'), key_pub)
        self.name_crypto = rsa.encrypt(self.name.encode('utf8'), key_pub)
        self.patronymic_crypto = rsa.encrypt(self.patronymic.encode('utf8'), key_pub)
        self.ser_passport_crypto = rsa.encrypt(self.ser_passport.encode('utf8'), key_pub)
        self.number_passport_crypto = rsa.encrypt(self.number_passport.encode('utf8'), key_pub)

        self.load_key_task_crypto()

    def load_key_task_crypto(self):
        k = [self.number_1_crypto, self.number_2_crypto, self.number_3_crypto, self.number_4_crypto, self.number_5_crypto,
             self.number_6_crypto, self.number_7_crypto, self.number_8_crypto, self.number_9_crypto, self.number_10_crypto,
             self.number_11_crypto, self.number_12_crypto, self.dd_mm_yy_crypto, self.region_crypto, self.code_eo_crypto,
             self.number_class_crypto, self.letter_class_crypto, self.code_location_event_crypto, self.number_auditorium_crypto,
             self.number_option_crypto, self.code_subject_crypto, self.item_name_crypto, self.number_kim_crypto, self.surname_crypto,
             self.name_crypto, self.patronymic_crypto, self.ser_passport_crypto, self.number_passport_crypto]

        directory_save_key = "G:\PyCharm\PyCharmProject\projectSAFTD_x32\OGE/TEST.txt"

        with open(directory_save_key, "w") as f:
            f.write("\n".join(base64.b64encode(item).decode('utf8') for item in k))

        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        msg.setText("Информация")
        msg.setInformativeText('Ответы на задание ОГЭ сохранены в БД программы. '
                               'Сообщите администратору о готовности покинуть аудиторию.')
        msg.setWindowTitle("Информация")
        msg.exec_()



if __name__ == "__main__":
    import sys


    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("Fusion")

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

Интерфейс: https://drive.google.com/file/d/1mXfYQKxhX2k2wxNmUs896TTDOn1q5foM/view?usp=sharing


Ответы (1 шт):

Автор решения: S. Nick

Нельзя использовать time.sleep() - это замораживает интерфейс.

Класс QTimer предоставляет повторяющиеся и однократные таймеры.

main.py

from PyQt5 import QtCore, QtGui, QtWidgets
from oge import Ui_MainWindow
from PyQt5.Qt import *
from datetime import datetime, timedelta
import time
import rsa
import base64
import os


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("Automatic OGE verification system ver.00.09.56")

        (self.key_pub, self.key_priv) = rsa.newkeys(512)
        self.pushButton.clicked.connect(self.information)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
#        self.time()

        self.beg = datetime.strptime(str('01:59:59'), '%H:%M:%S')
#        self.end = datetime.strptime(str('00:00:00'), '%H:%M:%S')
        self.end = datetime.strptime(str('01:59:49'), '%H:%M:%S')    # только для теста
        self.step = timedelta(seconds=1)
        
        self.timer = QtCore.QTimer()
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self._time)
        self.timer.start()
        
        self.lable_55.setStyleSheet('background-color: #34626C; color: #CFD3CE; font-size: 25px;')

    def _time(self):
#        beg = datetime.strptime(str('01:59:59'), '%H:%M:%S')
#        end = datetime.strptime(str('00:00:00'), '%H:%M:%S')
#        step = timedelta(seconds=1)
#        while beg != end:
        if self.beg != self.end:
            self.beg = self.beg - self.step
#            print(str(self.beg).split()[1])
            self.lable_55.setText(str(self.beg).split()[1])
#            time.sleep(1)
        else:
            self.timer.stop()
            self.lable_55.setStyleSheet('background-color: #34626C; color: #f00; font-size: 25px;')
            
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


    def information(self):
        self.dd_mm_yy = self.lineEdit_6.text()
        self.region = self.lineEdit_7.text()
        self.code_eo = self.lineEdit_8.text()
        self.number_class = self.lineEdit_9.text()
        self.letter_class = self.lineEdit_13.text()
        self.code_location_event = self.lineEdit_14.text()
        self.number_auditorium = self.lineEdit_15.text()
        self.number_option = self.lineEdit_16.text()
        self.code_subject = self.lineEdit_17.text()
        self.item_name = self.lineEdit_18.text()
        self.number_kim = self.lineEdit_19.text()

        self.surname = self.lineEdit.text()
        self.name = self.lineEdit_2.text()
        self.patronymic = self.lineEdit_3.text()
        self.ser_passport = self.lineEdit_5.text()
        self.number_passport = self.lineEdit_4.text()

        sequences = (
            self.dd_mm_yy, self.region, self.code_eo, self.number_class, self.letter_class, self.code_location_event,
            self.number_auditorium, self.number_option, self.code_subject, self.item_name, self.number_kim,
            self.surname, self.name, self.patronymic, self.ser_passport, self.number_passport
        )

        if all(len(x) > 0 for x in sequences):
            if not os.path.exists('key_pub.pem'):
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Warning)
                msg.setText("Ошибка")
                msg.setInformativeText('ВНИМАНИЕ! В директории программы не обнаружен файл: "key_pub.pem"'
                                       'Обратитесь к техническому специалисту')
                msg.setWindowTitle("Ошибка")
                msg.exec_()
                return

            with open('key_pub.pem', "rb") as f:
                _key_pub = f.read()

            key_pub = self.key_pub.load_pkcs1(_key_pub)

            self.key_task(key_pub)
        else:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText("Ошибка")
            msg.setInformativeText('ВНИМАНИЕ! Обязательные поля данных не заполненны.'
                                   'Заполните их для завершения работы.'
                                   'Обратитесь к техническому специалисту')
            msg.setWindowTitle("Ошибка")
            msg.exec_()

    def key_task(self, key_pub):
        self.number_1 = self.lineEdit_20.text()
        self.number_2 = self.lineEdit_22.text()
        self.number_3 = self.lineEdit_21.text()
        self.number_4 = self.lineEdit_23.text()
        self.number_5 = self.lineEdit_24.text()
        self.number_6 = self.lineEdit_25.text()
        self.number_7 = self.lineEdit_26.text()
        self.number_8 = self.lineEdit_27.text()
        self.number_9 = self.lineEdit_28.text()
        self.number_10 = self.lineEdit_29.text()
        self.number_11 = self.lineEdit_30.text()
        self.number_12 = self.lineEdit_31.text()

        self.key_task_crypto(key_pub)

    def key_task_crypto(self, key_pub):
        self.number_1_crypto = rsa.encrypt(self.number_1.encode('utf8'), key_pub)
        self.number_2_crypto = rsa.encrypt(self.number_2.encode('utf8'), key_pub)
        self.number_3_crypto = rsa.encrypt(self.number_3.encode('utf8'), key_pub)
        self.number_4_crypto = rsa.encrypt(self.number_4.encode('utf8'), key_pub)
        self.number_5_crypto = rsa.encrypt(self.number_5.encode('utf8'), key_pub)
        self.number_6_crypto = rsa.encrypt(self.number_6.encode('utf8'), key_pub)
        self.number_7_crypto = rsa.encrypt(self.number_7.encode('utf8'), key_pub)
        self.number_8_crypto = rsa.encrypt(self.number_8.encode('utf8'), key_pub)
        self.number_9_crypto = rsa.encrypt(self.number_9.encode('utf8'), key_pub)
        self.number_10_crypto = rsa.encrypt(self.number_10.encode('utf8'), key_pub)
        self.number_11_crypto = rsa.encrypt(self.number_11.encode('utf8'), key_pub)
        self.number_12_crypto = rsa.encrypt(self.number_12.encode('utf8'), key_pub)

        self.dd_mm_yy_crypto = rsa.encrypt(self.dd_mm_yy.encode('utf8'), key_pub)
        self.region_crypto = rsa.encrypt(self.region.encode('utf8'), key_pub)
        self.code_eo_crypto = rsa.encrypt(self.code_eo.encode('utf8'), key_pub)
        self.number_class_crypto = rsa.encrypt(self.number_class.encode('utf8'), key_pub)
        self.letter_class_crypto = rsa.encrypt(self.letter_class.encode('utf8'), key_pub)
        self.code_location_event_crypto = rsa.encrypt(self.code_location_event.encode('utf8'), key_pub)
        self.number_auditorium_crypto = rsa.encrypt(self.number_auditorium.encode('utf8'), key_pub)
        self.number_option_crypto = rsa.encrypt(self.number_option.encode('utf8'), key_pub)
        self.code_subject_crypto = rsa.encrypt(self.code_subject.encode('utf8'), key_pub)
        self.item_name_crypto = rsa.encrypt(self.item_name.encode('utf8'), key_pub)
        self.number_kim_crypto = rsa.encrypt(self.number_kim.encode('utf8'), key_pub)

        self.surname_crypto = rsa.encrypt(self.surname.encode('utf8'), key_pub)
        self.name_crypto = rsa.encrypt(self.name.encode('utf8'), key_pub)
        self.patronymic_crypto = rsa.encrypt(self.patronymic.encode('utf8'), key_pub)
        self.ser_passport_crypto = rsa.encrypt(self.ser_passport.encode('utf8'), key_pub)
        self.number_passport_crypto = rsa.encrypt(self.number_passport.encode('utf8'), key_pub)

        self.load_key_task_crypto()

    def load_key_task_crypto(self):
        k = [self.number_1_crypto, self.number_2_crypto, self.number_3_crypto, self.number_4_crypto, self.number_5_crypto,
             self.number_6_crypto, self.number_7_crypto, self.number_8_crypto, self.number_9_crypto, self.number_10_crypto,
             self.number_11_crypto, self.number_12_crypto, self.dd_mm_yy_crypto, self.region_crypto, self.code_eo_crypto,
             self.number_class_crypto, self.letter_class_crypto, self.code_location_event_crypto, self.number_auditorium_crypto,
             self.number_option_crypto, self.code_subject_crypto, self.item_name_crypto, self.number_kim_crypto, self.surname_crypto,
             self.name_crypto, self.patronymic_crypto, self.ser_passport_crypto, self.number_passport_crypto]

        directory_save_key = "G:\PyCharm\PyCharmProject\projectSAFTD_x32\OGE/TEST.txt"

        with open(directory_save_key, "w") as f:
            f.write("\n".join(base64.b64encode(item).decode('utf8') for item in k))

        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        msg.setText("Информация")
        msg.setInformativeText('Ответы на задание ОГЭ сохранены в БД программы. '
                               'Сообщите администратору о готовности покинуть аудиторию.')
        msg.setWindowTitle("Информация")
        msg.exec_()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("Fusion")
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка