Зависает программа при выполнении через PyQt5
я пытаюсь соединить алгоритм своей программы с графической оболочкой сделанной в Qt Designer. Но при запуске основного алгоритма (код представлен ниже) программа зависает, но выполняет алогоритм. При прохождении основного цикла в функции "start" необходимо изменять текст в одном из label, но этого не происходит, после завершения цикла выдается сообщение об ошибке и Python вылетает, как с этим бороться? Если честно это одна из моих первых программ составленных с помощью PyQt5, я так понимаю многие вещи можно оптимизировать если вынести настройки интерфейса в отдельный файл класса
import os
import numpy as np
from PIL import Image
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
step = 0
def find_numbers(s):
l = len(s)
integ = []
i = 0
while i < l:
s_int = ''
a = s[i]
while '0' <= a <= '9':
s_int += a
i += 1
if i < l:
a = s[i]
else:
break
i += 1
if s_int != '':
integ.append(int(s_int))
return(integ)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(816, 601)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 0, 404, 231))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.folder_path_label = QtWidgets.QLabel(self.verticalLayoutWidget)
font = QtGui.QFont()
font.setPointSize(12)
self.folder_path_label.setFont(font)
self.folder_path_label.setObjectName("folder_path_label")
self.verticalLayout.addWidget(self.folder_path_label)
self.btn_browse_path_folder = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.btn_browse_path_folder.setObjectName("btn_browse_path_folder")
self.verticalLayout.addWidget(self.btn_browse_path_folder)
self.path1 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.path1.setText("")
self.path1.setObjectName("path1")
self.verticalLayout.addWidget(self.path1)
self.save_path_label = QtWidgets.QLabel(self.verticalLayoutWidget)
font = QtGui.QFont()
font.setPointSize(12)
self.save_path_label.setFont(font)
self.save_path_label.setObjectName("save_path_label")
self.verticalLayout.addWidget(self.save_path_label)
self.btn_browse_save_folder = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.btn_browse_save_folder.setObjectName("btn_browse_save_folder")
self.verticalLayout.addWidget(self.btn_browse_save_folder)
self.path2 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.path2.setText("")
self.path2.setObjectName("path2")
self.verticalLayout.addWidget(self.path2)
self.inf_label = QtWidgets.QLabel(self.centralwidget)
self.inf_label.setGeometry(QtCore.QRect(430, 0, 211, 31))
font = QtGui.QFont()
font.setPointSize(15)
self.inf_label.setFont(font)
self.inf_label.setObjectName("inf_label")
self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(430, 20, 251, 211))
self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.count_frames_label = QtWidgets.QLabel(self.verticalLayoutWidget_2)
font = QtGui.QFont()
font.setPointSize(12)
self.count_frames_label.setFont(font)
self.count_frames_label.setObjectName("count_frames_label")
self.verticalLayout_2.addWidget(self.count_frames_label)
self.count_label = QtWidgets.QLabel(self.verticalLayoutWidget_2)
font = QtGui.QFont()
font.setPointSize(12)
self.count_label.setFont(font)
self.count_label.setText("")
self.count_label.setObjectName("count_label")
self.verticalLayout_2.addWidget(self.count_label)
self.size_img_label = QtWidgets.QLabel(self.verticalLayoutWidget_2)
font = QtGui.QFont()
font.setPointSize(12)
self.size_img_label.setFont(font)
self.size_img_label.setObjectName("size_img_label")
self.verticalLayout_2.addWidget(self.size_img_label)
self.size_label = QtWidgets.QLabel(self.verticalLayoutWidget_2)
font = QtGui.QFont()
font.setPointSize(12)
self.size_label.setFont(font)
self.size_label.setText("")
self.size_label.setObjectName("size_label")
self.verticalLayout_2.addWidget(self.size_label)
self.finish_label = QtWidgets.QLabel(self.verticalLayoutWidget_2)
font = QtGui.QFont()
font.setPointSize(12)
self.finish_label.setFont(font)
self.finish_label.setText("")
self.finish_label.setObjectName("finish_label")
self.verticalLayout_2.addWidget(self.finish_label)
self.btn_start = QtWidgets.QPushButton(self.centralwidget)
self.btn_start.setGeometry(QtCore.QRect(680, 20, 131, 141))
font = QtGui.QFont()
font.setPointSize(10)
self.btn_start.setFont(font)
self.btn_start.setObjectName("btn_start")
self.verticalLayoutWidget_3 = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(10, 230, 791, 291))
self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.image_label = QtWidgets.QLabel(self.verticalLayoutWidget_3)
self.image_label.setText("")
self.image_label.setScaledContents(True)
self.image_label.setObjectName("image_label")
self.verticalLayout_3.addWidget(self.image_label)
self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.gridLayoutWidget.setGeometry(QtCore.QRect(470, 530, 321, 42))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.status_label = QtWidgets.QLabel(self.gridLayoutWidget)
font = QtGui.QFont()
font.setPointSize(12)
self.status_label.setFont(font)
self.status_label.setObjectName("status_label")
self.gridLayout.addWidget(self.status_label, 0, 1, 1, 1)
self.steps_status_label = QtWidgets.QLabel(self.gridLayoutWidget)
font = QtGui.QFont()
font.setPointSize(12)
self.steps_status_label.setFont(font)
self.steps_status_label.setText("")
self.steps_status_label.setObjectName("steps_status_label")
self.gridLayout.addWidget(self.steps_status_label, 0, 2, 1, 1)
self.gridLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
self.gridLayoutWidget_2.setGeometry(QtCore.QRect(10, 530, 441, 41))
self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2")
self.gridLayout_3 = QtWidgets.QGridLayout(self.gridLayoutWidget_2)
self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
self.gridLayout_3.setObjectName("gridLayout_3")
self.progress_label = QtWidgets.QLabel(self.gridLayoutWidget_2)
font = QtGui.QFont()
font.setPointSize(12)
self.progress_label.setFont(font)
self.progress_label.setObjectName("progress_label")
self.gridLayout_3.addWidget(self.progress_label, 0, 0, 1, 1)
self.progressBar = QtWidgets.QProgressBar(self.gridLayoutWidget_2)
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.gridLayout_3.addWidget(self.progressBar, 0, 1, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.btn_browse_path_folder.clicked.connect(self.browsefiles1) # если нажал на кнопку для указания пути к папкам 12345
self.btn_browse_save_folder.clicked.connect(self.browsefiles2) # если нажал на кнопку для указания пути сохранения
self.btn_start.clicked.connect(self.start)
#-------------------------#
def browsefiles1(self):
filename = QFileDialog.getExistingDirectory(None,"Выбрать папку",".")
self.path1.setText(filename)
folder_path = filename
num_files = len([f for f in os.listdir(folder_path + '/1')
if os.path.isfile(os.path.join(folder_path + '/1', f))])
self.count_label.setText(str(num_files))
img_test = Image.open(folder_path + '/empty.tif')
(width, heighth) = img_test.size
#print(width, heighth)
self.size_label.setText(str(width)+'px'+' X '+str(heighth)+'px')
#-------------------------#
def browsefiles2(self):
filename = QFileDialog.getExistingDirectory(None,"Выбрать папку",".")
self.path2.setText(filename)
# методы для открытия обзорщика файлов и выбора папки
#-------------------------#
def start(self):
global string_step
s = self.size_label.text()
column = int(find_numbers(s)[0])
row = int(find_numbers(s)[1])
count = 2 # количество столбиков, которое нужно взять
num_files = int(self.count_label.text())
folder_path = self.path1.text()
save_path = self.path2.text()
for step in range(0, num_files+1):
if step < 10:
string_step = '000' + str(step)
if (step >= 10) and (step < 100):
string_step = '00' + str(step)
if (step >= 100):
string_step = '0' + str(step)
img0 = np.array(Image.open(folder_path + '/empty.tif').convert('RGB'))
img1 = np.array(Image.open(folder_path + '/1/folder1w' + string_step + '.tif').convert('RGB'))
img2 = np.array(Image.open(folder_path + '/2/folder2w' + string_step + '.tif').convert('RGB'))
img3 = np.array(Image.open(folder_path + '/3/folder3w' + string_step + '.tif').convert('RGB'))
img4 = np.array(Image.open(folder_path + '/4/folder4w' + string_step + '.tif').convert('RGB'))
img5 = np.array(Image.open(folder_path + '/5/folder5w' + string_step + '.tif').convert('RGB'))
# с какой строчки начинаем (0,2,4,6,8)
space = 8 # 8 промежуток между столбцами
first_column = 0
for i in range(first_column, column, space + 2):
for j in range(0, row):
img0[j][i + count - 1] = img1[j][i + count - 1]
img0[j][i] = img1[j][i]
first_column = 2
for i in range(first_column, column, space + 2):
for j in range(0, row):
img0[j][i + count - 1] = img2[j][i + count - 1]
img0[j][i] = img2[j][i]
first_column = 4
for i in range(first_column, column, space + 2):
for j in range(0, row):
img0[j][i + count - 1] = img3[j][i + count - 1]
img0[j][i] = img3[j][i]
first_column = 6
for i in range(first_column, column, space + 2):
for j in range(0, row):
img0[j][i + count - 1] = img4[j][i + count - 1]
img0[j][i] = img4[j][i]
first_column = 8
for i in range(first_column, column, space + 2):
for j in range(0, row):
img0[j][i + count - 1] = img5[j][i + count - 1]
img0[j][i] = img5[j][i]
img = Image.fromarray(img0, 'RGB')
self.steps_status_label.setText(str(step) + ' из ' + str(num_files))
#print(str(step+1) + ' из ' + str(num_files))
img.save(save_path + '/frame' + str(step) + '.jpg')
#-------------------------#
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.folder_path_label.setText(_translate("MainWindow", "Введите путь к папкам с изображениями"))
self.btn_browse_path_folder.setText(_translate("MainWindow", "Обзор"))
self.save_path_label.setText(_translate("MainWindow", "Введите путь для сохранения изображений"))
self.btn_browse_save_folder.setText(_translate("MainWindow", "Обзор"))
self.inf_label.setText(_translate("MainWindow", "Информация:"))
self.count_frames_label.setText(_translate("MainWindow", "Количество кадров:"))
self.size_img_label.setText(_translate("MainWindow", "Размер изображений:"))
self.btn_start.setText(_translate("MainWindow", "Начать обработку"))
self.status_label.setText(_translate("MainWindow", "Статус:"))
self.progress_label.setText(_translate("MainWindow", "Прогресс:"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())