Запуск программ по очереди

как осуществить запуск выбранных программ по очереди (по одной)

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


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

        self.centralwidget = QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setStyleSheet("background-color: rgb(0, 0, 0);")
        self.setCentralWidget(self.centralwidget)

        self.checkBoxes = {
            'Chrome': '', 'Yandex': '', 'FireFox': '',
            'Opera': '', 'OperaGX': '', 'Edge': '',
            'Vivaldi': '', 'uTorrent': '', 'qBitTorrent': '',
            'Transmission': '', 'LibreOffice': '', 'NotePad++': 'Notepad.exe',
# -------------------------------------------------------------> ^^^^^^^^^^^
            'winRAR': '', 'Thony': '', 'Atom': '',
            '7zip': '', 'MicrosoftOffce': '', 'Gvim': '',
            'VSCode': '', 'SublimeText': '', 'Everything': '',
            'Windirstat': '', 'AnvirTM': '', 'InfoCD': '',
            'LockHunter': '', 'AIDA64': 'AIDA64.exe', 'CDbxp': '',
            'Unlocker': '', 'MarkCD': '', 'HDTunePro': '',
            'CpuZ': 'CpuZ.exe', 'AIMP': 'AIMP.exe', 'Gimp': '',
            'KMPlayer': '', 'GpuZ': '', 'VLC': '',
            'CoreTemp': '', 'MSIAfterburner': '', 'Lightshot': '',
            'CyberLink': 'CyberLink.exe', 'DriverBooster': '', 'MiniBin': '',
            'VNCServer': '', 'DriverHub': '', 'Xrecode III': '',
            'EarTrumpet': '', 'FileConverter': '', 'TimeER': '',
            'Калькулятор': 'calc.exe',
# ------------------------> ^^^^^^^^
        }
        
        many_cb = len(self.checkBoxes)                     
        column = 5 
        layout = QGridLayout(self.centralwidget)
        self.check_boxes = []

        for step, name in enumerate(self.checkBoxes):
            cb = QCheckBox(name, objectName=name.lower())
            cb.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                             "color: rgb(85, 255, 127);")            
            row = step // column
            col = step % column
            layout.addWidget(cb, row, col)  
            self.check_boxes.append(cb)

        self.frame = QFrame()   
        self.Development = QPushButton('Development')
        self.Development.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                       "color: rgb(124, 252, 0);")
        self.Libraries = QPushButton('Libraries')
        self.Libraries.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                     "color: rgb(124, 252, 0);")
        self.View = QPushButton('View')
        self.View.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                "color: rgb(124, 252, 0);")
        self.Install = QPushButton('Install')
        self.Install.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                   "color: rgb(255, 215, 0);")
        self.SPforPC = QPushButton('SPforPC')
        self.SPforPC.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                   "color: rgb(240, 230, 140);")
        self.SPforNoteBook = QPushButton('SPforNoteBook')
        self.SPforNoteBook.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                         "color: rgb(240, 230, 140);")
        layoutV = QVBoxLayout(self.frame)
        layoutV.setContentsMargins(0, 0, 0, 0)
        layoutV.addWidget(self.Development) 
        layoutV.addWidget(self.Libraries)         
        layoutV.addWidget(self.View) 
        layoutV.addStretch(1)
        layoutV.addWidget(self.SPforNoteBook) 
        layoutV.addWidget(self.SPforPC)        
        layoutV.addWidget(self.Install) 
        
        layout.addWidget(self.frame, 0, column, row+1, 1)
        
        self.Install.clicked.connect(self.start_installation)  
        
    def start_installation(self):
        self.process = []
        for box in self.check_boxes:
           if box.isChecked():
               name_exe = self.checkBoxes.get(box.text())
               #print(f'{box.text()} -- {name_exe}') 
               
               if name_exe:
                   process = QtCore.QProcess(self)
                   self.process.append(process)
                   
                   self.process[-1].stateChanged.connect(
                       lambda state, name=name_exe: self.new_state(state, name)) 
                   
                   self.process[-1].start(name_exe) 
               
    def new_state(self, newState, name):
        if newState == 1:
            text = f"\nПроцесс запускается, но программа {name} еще не запущена."
        elif newState == 2:
            text = f"Процесс запущен и программа {name} готова к работе."
        elif newState == 0:
            text = f"Процесс {name} не запущен."
        print(f'{text}') #
    

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

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

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

Попробуйте, я отметил по коду изменения, которые сделал. Читаем принты, которые я добавил для понимания происходящего.

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class MainWindow(QMainWindow): 
    def __init__(self):
        super().__init__()

        self.centralwidget = QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setStyleSheet("background-color: rgb(0, 0, 0);")
        self.setCentralWidget(self.centralwidget)

        self.checkBoxes = {
            'Chrome': '', 'Yandex': '', 'FireFox': '',
            'Opera': '', 'OperaGX': '', 'Edge': '',
            'Vivaldi': '', 'uTorrent': '', 'qBitTorrent': '',
            'Transmission': '', 'LibreOffice': '', 'NotePad++': 'Notepad.exe',
# -------------------------------------------------------------> ^^^^^^^^^^^
            'winRAR': '', 'Thony': '', 'Atom': '',
            '7zip': '', 'MicrosoftOffce': '', 'Gvim': '',
            'VSCode': '', 'SublimeText': '', 'Everything': '',
            'Windirstat': '', 'AnvirTM': '', 'InfoCD': '',
            'LockHunter': '', 'AIDA64': 'AIDA64.exe', 'CDbxp': '',
            'Unlocker': '', 'MarkCD': '', 'HDTunePro': '',
            'CpuZ': 'CpuZ.exe', 'AIMP': 'AIMP.exe', 'Gimp': '',
            'KMPlayer': '', 'GpuZ': '', 'VLC': '',
            'CoreTemp': '', 'MSIAfterburner': '', 'Lightshot': '',
            'CyberLink': 'CyberLink.exe', 'DriverBooster': '', 'MiniBin': '',
            'VNCServer': '', 'DriverHub': '', 'Xrecode III': '',
            'EarTrumpet': '', 'FileConverter': '', 'TimeER': '',
            'Калькулятор': 'calc.exe',
# ------------------------> ^^^^^^^^
        }

        many_cb = len(self.checkBoxes)                     
        column = 5 
        layout = QGridLayout(self.centralwidget)
# !!! +++
        self.check_boxes = {}                            # теперь словарь
        self.process_state = 0                           # +++
#        self.process = []                               # убран как ненужный

        for step, name in enumerate(self.checkBoxes):
            cb_obj_name = name.lower()  
            cb = QCheckBox(name, objectName=cb_obj_name)
            cb.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                             "color: rgb(85, 255, 127);")            
            row = step // column
            col = step % column
            layout.addWidget(cb, row, col)  
            self.check_boxes[cb] = 0                                      # !!!
            
            cb.stateChanged.connect(                                      # +++
                lambda state, cb=cb: self.select_cb(state, cb)            # +++
            )                                                             # +++

        self.frame = QFrame()   
        self.Development = QPushButton('Development')
        self.Development.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                       "color: rgb(124, 252, 0);")
        self.Libraries = QPushButton('Libraries')
        self.Libraries.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                     "color: rgb(124, 252, 0);")
        self.View = QPushButton('View')
        self.View.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                "color: rgb(124, 252, 0);")
        self.Install = QPushButton('Install')
        self.Install.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                   "color: rgb(255, 215, 0);")
        self.SPforPC = QPushButton('SPforPC')
        self.SPforPC.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                   "color: rgb(240, 230, 140);")
        self.SPforNoteBook = QPushButton('SPforNoteBook')
        self.SPforNoteBook.setStyleSheet("background-color: rgb(0, 0, 0);\n"
                                         "color: rgb(240, 230, 140);")
        layoutV = QVBoxLayout(self.frame)
        layoutV.setContentsMargins(0, 0, 0, 0)
        layoutV.addWidget(self.Development) 
        layoutV.addWidget(self.Libraries)         
        layoutV.addWidget(self.View) 
        layoutV.addStretch(1)
        layoutV.addWidget(self.SPforNoteBook) 
        layoutV.addWidget(self.SPforPC)        
        layoutV.addWidget(self.Install) 
        
        layout.addWidget(self.frame, 0, column, row+1, 1)
        
        self.Install.clicked.connect(self.start_installation)  

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def select_cb(self, state, cb):                                       # !!! +++
        self.check_boxes[cb] = state                                      # !!!
        
    def start_installation(self):
        if self.process_state:
            print(f'\nПроцесс запущен -- {self.process_state}. \n'
                   'Ожидайте его завершения или закройте его.\n') #       
            return
           
        self.go_process()    
    
    def go_process(self):
        for cb_obj, cb_state in self.check_boxes.items():
            if cb_state:
                name_exe = self.checkBoxes.get(cb_obj.text())
                if name_exe:
                    process = QtCore.QProcess(self)
                    self.process_state = 1
                    
                    process.stateChanged.connect(
                        lambda state, name=name_exe: self.new_state(state, name)) 
                    process.start(name_exe)  

                    self.check_boxes[cb_obj] = 0
                    cb_obj.setCheckState(QtCore.Qt.Unchecked)
                    break
                else:
                    print(f'\nНечего запускать, name_exe пуст - `{name_exe}`. \n'
                           'Добавьте в справочник название модуля для запуска.\n') 
                    cb_obj.setCheckState(QtCore.Qt.Unchecked)
                not_select = False
            else:
                not_select = True
        if not_select:    
            print(f'\nНечего запускать, ничего не выбрано для запуска.\n') #    
               
    def new_state(self, newState, name):
        if newState == 1:
            text = f"\nПроцесс запускается, но программа {name} еще не запущена."
        elif newState == 2:
            text = f"Процесс запущен и программа {name} готова к работе."
        elif newState == 0:
            text = f"Процесс {name} не запущен."
            
            self.process_state = 0                                        # !!! +++
            self.go_process()                                             # !!! +++           
            
        print(f'{text}') #
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

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

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

→ Ссылка