J
No change. code Qt Designer♪ !♪ Create another class that inherits from the relevant view and use the established class to fill it.Yeah, you need an extra flow because your calculations are heavy. If you don't understand anything, ask.And the global variables are the Evil.import os
import numpy as np
from PIL import Image
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(816, 650)
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.setGeometry(QtCore.QRect(10, 230, 791, 340))
self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
!!!
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
self.verticalLayout_3 = QtWidgets.QGridLayout(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.setGeometry(QtCore.QRect(470, 600, 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)
vvv
self.gridLayoutWidget_2.setGeometry(QtCore.QRect(10, 600, 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)
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", "Прогресс:"))
class Thread(QtCore.QThread):
stepSignal = QtCore.pyqtSignal(int, str)
def __init__(self, num_files, folder_path, save_path, row, column, parent=None):
super(Thread, self).__init__(parent)
self.num_files = num_files
self.folder_path = folder_path
self.save_path = save_path
self.row = row
self.column = column
def run(self):
count = 2 # количество столбиков, которое нужно взять
for step in range(0, self.num_files): # ??? + 1):
print(f'step = {step}') #
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(self.folder_path + '/empty.tif').convert('RGB'))
img1 = np.array(Image.open(
self.folder_path + '/1/folder1w' + string_step + '.tif').convert('RGB'))
img2 = np.array(Image.open(self.folder_path + '/2/folder2w' + string_step + '.tif').convert('RGB'))
img3 = np.array(Image.open(self.folder_path + '/3/folder3w' + string_step + '.tif').convert('RGB'))
img4 = np.array(Image.open(self.folder_path + '/4/folder4w' + string_step + '.tif').convert('RGB'))
img5 = np.array(Image.open(self.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, self.column, space + 2):
for j in range(0, self.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, self.column, space + 2):
for j in range(0, self.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, self.column, space + 2):
for j in range(0, self.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, self.column, space + 2):
for j in range(0, self.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, self.column, space + 2):
for j in range(0, self.row):
img0[j][i + count - 1] = img5[j][i + count - 1]
img0[j][i] = img5[j][i]
img = Image.fromarray(img0, 'RGB')
path = self.save_path + '/frame' + str(step) + '.jpg'
img.save(path)
self.stepSignal.emit(step, path)
self.msleep(100)
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def init(self):
super().init()
self.setupUi(self)
# если нажал на кнопку для указания пути к папкам 12345
self.btn_browse_path_folder.clicked.connect(
self.browsefiles1)
# если нажал на кнопку для указания пути сохранения
self.btn_browse_save_folder.clicked.connect(self.browsefiles2)
self.btn_start.clicked.connect(self.start)
# vvvvvvvvvvvvvvvvvvvvvv #
self.folder_path = None
self.num_files = None
self.column = None
self.row = None
self.save_path = None
def browsefiles1(self):
self.folder_path = QFileDialog.getExistingDirectory(None, "Выбрать папку", ".")
if not self.folder_path:
return
self.path1.setText(self.folder_path)
self.num_files = len([f for f in os.listdir(self.folder_path + '/1')
if os.path.isfile(os.path.join(self.folder_path + '/1', f))])
self.count_label.setText(str(self.num_files))
img_test = Image.open(self.folder_path + '/empty.tif')
(self.column, self.row) = img_test.size
self.size_label.setText(str(self.column) + 'px' + ' X ' + str(self.row) + 'px')
def browsefiles2(self):
self.save_path = QFileDialog.getExistingDirectory(None, "Выбрать папку", ".")
self.path2.setText(self.save_path)
def start(self):
self.progressBar.setRange(0, self.num_files)
self.thread = Thread(
self.num_files, self.folder_path, self.save_path,
self.row, self.column
)
self.thread.stepSignal.connect(self.uilabels)
self.thread.start()
def uilabels(self, step, path):
self.steps_status_label.setText(str(step+1)+' из '+str(self.num_files))
self.progressBar.setValue(step+1)
label = QtWidgets.QLabel()
label.setFixedSize(187, 106)
label.setPixmap(QtGui.QPixmap(path).scaled(150, 106))
column = 5
self.verticalLayout_3.addWidget(label, step // column, step % column)
if name == "main":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())