Здраствуйте, подскажите как исправить проблему с запуском дочернего окна.
При выборе в первом окне Checkbox и нажатию на кнопку "Установить" должно открываться дочернее окно с Прогрессбаром, но дочернее окно зависает.
При выборе в первом окне Checkbox и нажатию на кнопку "Установить" должно открываться дочернее окно с Прогрессбаром, но дочернее окно зависает.
Код:
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QWidget, QDialog, QAction, QProgressBar, QMessageBox, QWidget, QMainWindow, QApplication
import subprocess
import threading
import time
import sys
class window_2(QWidget):
#def __init__(self):
#super().__init__()
#self.setupUi()
def setupUi(self):
self.w2 = window_2()
self.w2.resize(250, 300)
self.w2.setWindowTitle('Прогресс бар')
self.w2.progressBar = QProgressBar(self)
self.w2.progressBar.setGeometry(0, 0, 300, 25)
self.w2.progressBar.setProperty("value", 0)
self.w2.progressBar.setMaximum(100)
self.w2.show()
#self.w2.exec_()
#self.progressBar = QProgressBar(self)
#self.progressBar.setGeometry(30,40,200,25)
#self.progressBar.setProperty("value", 0)
#self.timer = QBasicTimer()
self.step = 0
class window(QMainWindow):
def __init__(self):
super().__init__()
def setupUi(self):
window.resize(330, 259)
quit = QAction("Quit", None )
quit.triggered.connect(self.closeEvent)
self.centralwidget = QtWidgets.QWidget(window)
self.centralwidget.setObjectName("centralwidget")
#self.progressBar = QtWidgets.QProgressBar(self)
#self.progressBar.setGeometry(30,40,200,25)
#self.progressBar.setProperty("value", 0)
#self.progressBar.setObjectName("progressBar")
#Кнопка Установить
self.Btn1 = QtWidgets.QPushButton(self.centralwidget)
self.Btn1.setCheckable(False)
self.Btn1.toggle()
self.Btn1.setEnabled(False)
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)
window.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(window)
self.statusbar.setObjectName("statusbar")
window.setStatusBar(self.statusbar)
self.retranslateUi(window)
QtCore.QMetaObject.connectSlotsByName(window)
def closeEvent(self, event):
close = QMessageBox()
close.setText("Вы уверены что хотите выйти из программы?")
close.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel)
close.setWindowTitle("Завершение программы")
close = close.exec()
if close == QMessageBox.Yes:
event.accept()
else:
event.ignore()
self.setWindowTitle("Сборник программ офицера ОБИ")
def retranslateUi(self, window):
_translate = QtCore.QCoreApplication.translate
window.setWindowTitle(_translate("MainWindow", "Сборник программ офицера ОБИ"))
self.Btn1.setText(_translate("MainWindow", "Установить"))
self.checkBox1.setText(_translate("MainWindow", "Калькулятор"))
self.checkBox2.setText(_translate("MainWindow", "Paint"))
def btnstate(self):
if self.checkBox1.isChecked():
self.Btn1.setEnabled(True)
print("Выбран элемент для установки - Калькулятор")
if self.checkBox2.isChecked():
self.Btn1.setEnabled(True)
print("Выбран элемент для установки - Paint")
def start_in_thread(self, program, data):
Popen(program)
self.progressBar.setValue(data)
#time.sleep(10) # это для имитации долгой работы программы
print(f'Запуск программы {program} завершен')
startlist = []
def whichbtn(self, w2):
w2 = window_2()
w2.setupUi()
if self.checkBox1.isChecked():
startlist = subprocess.Popen("C:/Windows/system32/calc.exe".split(),
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = startlist.communicate() #возврат
#progPercent += 30
if self.checkBox2.isChecked():
startlist = subprocess.Popen("C:/Windows/system32/mspaint.exe".split(),
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = startlist.communicate()
#progPercent += 30
for program in startlist:
t = threading.Thread(target=self.start_in_thread, args=[program])
t.start() # запуск программы в отдельном потоке
#self.updated.emit(int(self.progPercent))
#self.tmr.updated.connect(progress2(Program))
#self.tmr.start()
window.exec()
t.join() # ожидание окончания потока
main = QApplication(sys.argv)
window = window()
window.setupUi()
window.show()
sys.exit(main.exec_())