Отключить элементы при запуске QThread с PySide/PyQt

Вот что я получаю, когда нажимаю кнопку ОК.

Отключить элементы при запуске QThread с PySide/PyQt

Но я хотел бы отключить две кнопки, пока run_action() все еще работает, и, наконец, сбросить bar на 0.

Это мой текущий код:

import sys
import time

from PySide6.QtCore import QThread, Signal
from PySide6.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QProgressBar,
    QPushButton,
    QWidget,
)


class External(QThread):
    progressChanged = Signal(int)

    def run(self):
        progress = 0
        while progress < 100:
            progress += 10
            time.sleep(1)
            self.progressChanged.emit(progress)


class Window(QWidget):
    """The main application Window."""

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Example")

        self.layout = QHBoxLayout()
        self.layout.setContentsMargins(6, 6, 6, 6)

        self.bar = QProgressBar()
        self.bar.setTextVisible(False)
        self.bar.setValue(0)
        self.layout.addWidget(self.bar)

        self.cancel_btn = QPushButton("Cancel")
        self.cancel_btn.clicked.connect(self.close)
        self.layout.addWidget(self.cancel_btn)

        self.ok_btn = QPushButton("OK")
        self.ok_btn.clicked.connect(self.run_action)
        self.layout.addWidget(self.ok_btn)

        self.setLayout(self.layout)

    def run_action(self):
        self.ok_btn.setEnabled(False)
        self.cancel_btn.setEnabled(False)

        self.calc = External()
        self.calc.progressChanged.connect(self.onProgressChanged)
        self.calc.start()

        self.cancel_btn.setEnabled(True)
        self.ok_btn.setEnabled(True)
        self.bar.setValue(0)

    def onProgressChanged(self, value):
        self.bar.setValue(value)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

Если вы хотите включить кнопки и сбросить панель после завершения задачи, почему вы делаете это сразу после запуска треда? Кроме того, поскольку вы знаете окончательное значение завершения, не можете ли вы просто проверить, есть ли value == 100 в onProgressChanged(), а затем сделать то, что вам нужно?

musicamante 13.12.2020 14:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
446
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

пустота QThread::finished()

Этот сигнал испускается из связанного потока прямо перед тем, как он завершит выполнение.

Когда этот сигнал испускается, цикл обработки событий уже остановлен. Никакие другие события не будут обрабатываться в потоке, за исключением событий отложенного удаления. Этот сигнал можно подключить к QObject::deleteLater(), чтобы освободить объекты в этом потоке.

import sys
#import time

#from PySide6.QtCore import QThread, Signal
from PyQt5.QtCore import QThread, pyqtSignal

#from PySide6.QtWidgets import (
from PyQt5.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QProgressBar,
    QPushButton,
    QWidget,
)


class External(QThread):
#    progressChanged = Signal(int)
    progressChanged = pyqtSignal(int)

    def run(self):
        progress = 0
        while progress <= 100:
            self.progressChanged.emit(progress)
            self.msleep(500)
            progress += 10


class Window(QWidget):
    """The main application Window."""

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Example")

        self.layout = QHBoxLayout()
        self.layout.setContentsMargins(6, 6, 6, 6)

        self.bar = QProgressBar()
        self.bar.setTextVisible(False)
        self.bar.setValue(0)
        self.layout.addWidget(self.bar)

        self.cancel_btn = QPushButton("Cancel")
        self.cancel_btn.clicked.connect(self.close)
        self.layout.addWidget(self.cancel_btn)

        self.ok_btn = QPushButton("OK")
        self.ok_btn.clicked.connect(self.run_action)
        self.layout.addWidget(self.ok_btn)

        self.setLayout(self.layout)

    def run_action(self):
        self.ok_btn.setEnabled(False)        
        self.cancel_btn.setEnabled(False)        

        self.calc = External()
        self.calc.progressChanged.connect(self.onProgressChanged)
        self.calc.finished.connect(self.onFinished)                     # +++
        self.calc.start()

#        self.cancel_btn.setEnabled(True)
#        self.ok_btn.setEnabled(True)
#        self.bar.setValue(0)

    def onProgressChanged(self, value):
        self.bar.setValue(value)

    def onFinished(self):                                               # +++
        self.cancel_btn.setEnabled(True)
        self.ok_btn.setEnabled(True)
        self.bar.setValue(0)        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

Другие вопросы по теме