Запуск программ по очереди
как осуществить запуск выбранных программ по очереди (по одной)
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_())

