как сделать цикл в 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_())

