Запуск внешних программ

e8s22

Новичок
Пользователь
Июн 24, 2020
7
0
1
Помогите пожалуйста новичку.
Захотел сделать лаунчер для установки внешних программ с помощью QCheckBox (выбора что нужно установить) и закрепил за ними QPushbutton (кнопка:установить).
Если выбираю по отдельности checkbox, внешняя программа запускается.
Но: если выбираю несколько (в данном случае два checkboxа) при нажатии кнопки "Установить" ничего не происходит.
Помогите решить проблему =(


from PyQt5 import QtCore, QtGui, QtWidgets
from subprocess import Popen, PIPE
from multiprocessing import Process
import sys

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(230, 259)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
#Кнопка Установить
self.Btn1 = QtWidgets.QPushButton(self.centralwidget)
self.Btn1.setCheckable(False)
self.Btn1.toggle()
self.Btn1.clicked.connect( lambda: self.whichbtn(self.Btn1))
self.Btn1.setGeometry(QtCore.QRect(60, 160, 121, 41))
self.Btn1.setObjectName("Btn1")
#Кнопка 1
self.checkBox1 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox1.setGeometry(QtCore.QRect(70, 70, 101, 31))
self.checkBox1.setObjectName("checkBox1")
self.checkBox1.stateChanged.connect( self.btnstate)
#Кнопка 2
self.checkBox2 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox2.setGeometry(QtCore.QRect(70, 110, 101, 31))
self.checkBox2.setObjectName("checkBox2")
self.checkBox2.stateChanged.connect( self.btnstate)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.Btn1.setText(_translate("MainWindow", "Установить"))
self.checkBox1.setText(_translate("MainWindow", "Paint"))
self.checkBox2.setText(_translate("MainWindow", "Калькулятор"))
def btnstate(self):
if self.checkBox1.isChecked():
print ("Выбран элемент Paint")
if self.checkBox2.isChecked():
print ("Выбран элемент Калькулятор")

def whichbtn(self, Btn):
if self.checkBox1.isChecked():
p = Popen("C:/Windows/System32/mspaint.exe",shell=True, stdout=PIPE)
p.wait()
print("Запущен Paint")+ checkBox1.text()
if self.checkBox2.isChecked():
p = Popen("C:/Windows/System32/calc.exe", shell=True, stdout=PIPE)
p.wait()
print("Запущен Калькулятор")+ checkBox2.text()


if __name__ == "__main__":

app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
processes = [
multiprocessing.Process(target=whichbtn)
for p in processes
p.start()
for p in processes:
p.join()
sys.exit(app.exec_())
 

Вложения

  • Безымянный.png
    Безымянный.png
    16,4 КБ · Просмотры: 0

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Код вставляйте через кнопку ... -> код -> python.
Вот пример, который запускает 2 программы:
Python:
from PyQt5 import QtCore, QtWidgets
from subprocess import Popen
import sys


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(230, 259)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        #Кнопка Установить
        self.Btn1 = QtWidgets.QPushButton(self.centralwidget)
        self.Btn1.setCheckable(False)
        self.Btn1.toggle()
        self.Btn1.clicked.connect( lambda: self.whichbtn(self.Btn1))
        self.Btn1.setGeometry(QtCore.QRect(60, 160, 121, 41))
        self.Btn1.setObjectName("Btn1")
        #Кнопка 1
        self.checkBox1 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox1.setGeometry(QtCore.QRect(70, 70, 101, 31))
        self.checkBox1.setObjectName("checkBox1")
        self.checkBox1.stateChanged.connect( self.btnstate)
        #Кнопка 2
        self.checkBox2 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox2.setGeometry(QtCore.QRect(70, 110, 101, 31))
        self.checkBox2.setObjectName("checkBox2")
        self.checkBox2.stateChanged.connect( self.btnstate)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.Btn1.setText(_translate("MainWindow", "Установить"))
        self.checkBox1.setText(_translate("MainWindow", "Paint"))
        self.checkBox2.setText(_translate("MainWindow", "Калькулятор"))

    def btnstate(self):
        if self.checkBox1.isChecked():
            print("Выбран элемент Paint")
        if self.checkBox2.isChecked():
            print("Выбран элемент Калькулятор")

    def whichbtn(self, Btn):
        startlist = []
        if self.checkBox1.isChecked():
            startlist.append("C:/Windows/System32/mspaint.exe")

        if self.checkBox2.isChecked():
            startlist.append("C:/Windows/System32/calc.exe")

        for program in startlist:
            Popen(program)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
 
  • Мне нравится
Реакции: e8s22

e8s22

Новичок
Пользователь
Июн 24, 2020
7
0
1
Спасибо огромное за помощь!
 

e8s22

Новичок
Пользователь
Июн 24, 2020
7
0
1
а возможно ли через startlist реализовать не одновременную установку, а поочередно. Пока первая программа не установится, не запустится вторая?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
а возможно ли через startlist реализовать не одновременную установку, а поочередно. Пока первая программа не установится, не запустится вторая?
Можно например с помощью потоков. Запускать процессы запускающие программы в отдельном потоке, а потом ждать его завершения. В данном случае не нужно ждать завершения процесса (то есть закрытия программы) как при subprocess.wait().
Вот пример (sleep добавил для имитации долгого запуска программы):
Python:
from PyQt5 import QtCore, QtWidgets
from subprocess import Popen
import threading
import time
import sys


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(230, 259)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        #Кнопка Установить
        self.Btn1 = QtWidgets.QPushButton(self.centralwidget)
        self.Btn1.setCheckable(False)
        self.Btn1.toggle()
        self.Btn1.clicked.connect( lambda: self.whichbtn(self.Btn1))
        self.Btn1.setGeometry(QtCore.QRect(60, 160, 121, 41))
        self.Btn1.setObjectName("Btn1")
        #Кнопка 1
        self.checkBox1 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox1.setGeometry(QtCore.QRect(70, 70, 101, 31))
        self.checkBox1.setObjectName("checkBox1")
        self.checkBox1.stateChanged.connect( self.btnstate)
        #Кнопка 2
        self.checkBox2 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox2.setGeometry(QtCore.QRect(70, 110, 101, 31))
        self.checkBox2.setObjectName("checkBox2")
        self.checkBox2.stateChanged.connect( self.btnstate)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.Btn1.setText(_translate("MainWindow", "Установить"))
        self.checkBox1.setText(_translate("MainWindow", "Paint"))
        self.checkBox2.setText(_translate("MainWindow", "Калькулятор"))

    def btnstate(self):
        if self.checkBox1.isChecked():
            print("Выбран элемент Paint")
        if self.checkBox2.isChecked():
            print("Выбран элемент Калькулятор")

    def start_in_thread(self, program):
        Popen(program)
        time.sleep(10) # это для имитации долгой работы программы
        print(f'Запуск программы {program} завершен')

    def whichbtn(self, Btn):
        startlist = []
        if self.checkBox1.isChecked():
            startlist.append("C:/Windows/System32/mspaint.exe")

        if self.checkBox2.isChecked():
            startlist.append("C:/Windows/System32/calc.exe")

        for program in startlist:
            t = threading.Thread(target=self.start_in_thread, args=[program])
            t.start() # запуск программы в отдельном потоке
            t.join() # ожидание окончания потока


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
 
  • Мне нравится
Реакции: e8s22

Форум IT Специалистов