Потоки в PySide
Есть код, который запускает приложение, затем запускает поток, который каждую секунду меняет размер виджета в приложении:
class UsageLine(QFrame):
def __init__(self, parent):
super().__init__(parent)
self.setGeometry(10, 55, 10, 4)
self.setStyleSheet('background-color: rgb(17, 125, 187); border-radius: 2px;')
self.animation = QPropertyAnimation(self, b"size", EasingCurve=QEasingCurve.OutCubic)
def set(self, percentage):
self.animation.setEndValue(QSize(percentage * 3, 4))
self.animation.start()
class GUI(QMainWindow):
# something
self.cpu_usage = UsageLine(cpu_usage_frame)
Thread(target=self.dashboard_controller, daemon=True).start()
self.show()
def dashboard_controller(self):
while True:
if self.currentSpace.currentIndex() == 0:
self.cpu_usage.set(50)
sleep(1)
Функция set вызывается, но анимации нет
Тут есть что-то похожее, но не понятно как это использовать
Заранее спасибо.
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
В Qt достаточно своих средств, которые обеспечивают независимый от платформы способ управления потоками.
Но для вашего фрагмента, который вы показали, дополнительные потоки не нужны.
Вам достаточно использовать QTimer.
Класс QTimer предоставляет повторяющиеся и однократные таймеры.
Больше https://doc.qt.io/qt-5/qtimer.html
Вот одно из возможных решений:
import sys
from PyQt5.Qt import *
class UsageLine(QFrame):
def __init__(self, parent=None):
super().__init__(parent)
# self.setGeometry(10, 55, 10, 4)
self.setGeometry(10, 55, 0, 4)
self.setStyleSheet('background-color: rgb(17, 125, 187); border-radius: 2px;')
self.animation = QPropertyAnimation(
self,
b"size",
easingCurve=QEasingCurve.OutCubic
)
self.animation.setDuration(1000)
def set(self, percentage):
self.animation.setEndValue(QSize(percentage * 3, 4))
self.animation.start()
class GUI(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.percentage = 0
# something
self.cpu_usage = UsageLine(self.centralWidget) #(cpu_usage_frame)
# Thread(target=self.dashboard_controller, daemon=True).start()
self.timer = QTimer()
self.timer.timeout.connect(self.dashboard_controller)
QTimer.singleShot(10, self.timer_start)
def timer_start(self):
self.timer.start(1000)
def dashboard_controller(self):
# while True:
# ??? if self.currentSpace.currentIndex() == 0:
self.percentage += 10
self.cpu_usage.set(self.percentage)
if self.percentage >= 100:
self.timer.stop()
# sleep(1)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = GUI()
window.resize(320, 150)
window.show()
sys.exit(app.exec_())
