как сделать цикл в pyside2?

когда я нажимаю на кнопку, то программа не отвечает, и я уверен что это проблема в цикле.

import sys
import random
from PySide2 import QtCore, QtWidgets, QtGui
import time

#options
class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)

        self.button = QtWidgets.QPushButton("Start")
        self.text = QtWidgets.QLabel("00:00.00")
        self.text.setAlignment(QtCore.Qt.AlignCenter)

        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)

        self.button.clicked.connect(self.click)

        #timer
    def click(self):
        self.button.setText ("Stop")
        m = 0
        s = 0
        h = 0
        while True:
            time.sleep(0.01)
            m = m + 1
            if m == 100:
                s = s + 1
                m = 0
            if s == 60:
                h = h + 1
                s = 0
            self.text.setText (str(h) + ":" + str(s) + "." + str(m))


#start
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    widget = MyWidget()
    widget.show()

    sys.exit(app.exec_())

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


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

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

Никогда не используйте в основном потоке приложения цикл while и модуль time, они замораживают интерфейс.

Для вашей задачи используйте класс QTimer, который предоставляет повторяющиеся и одиночные таймеры. Читать https://doc.qt.io/qt-5/qtimer.html

Установите свои импорты, мои уберите и вперед.

import sys
#import random
#from PySide2 import QtCore, QtWidgets, QtGui      # ваш импорт
from PyQt5 import QtCore, QtWidgets, QtGui         # мой импорт
#import time


class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.button = QtWidgets.QPushButton("Start")
        self.button.clicked.connect(self.click)

        self.text = QtWidgets.QLabel("00:00:00")
        self.text.setAlignment(QtCore.Qt.AlignCenter)

        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.update_func)
        self.m, self.s, self.h = 0, 0, 0

    def click(self):
        text_btn = self.button.text()
        if text_btn == "Start":
            self.m, self.s, self.h = 0, 0, 0
            self.timer.start(10)                     # 10 ms
            self.button.setText ("Stop")
        else:
            self.timer.stop()        
            self.button.setText ("Start")

    def update_func(self):
        self.m += 1
        if self.m == 100:
            self.s += 1
            self.m = 0
        if self.s == 60:
            self.h += 1
            self.s = 0
        self.text.setText(f'{self.h:0>2}:{self.s:0>2}:{self.m:0>2}')


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec_())

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

→ Ссылка