본문 바로가기
  • 야근없는 삶을 위하여
파이썬

Python 이미지 세로로 합치기 - 11 (이미지 썸네일 표시)

by 우당코 2024. 3. 14.
반응형

이미지 경로 앞에 썸네일을 표시하기

아직 이미지 파일만 가져오는 것을 완료하지 않았다면 이전 글 참고

 

Python 이미지 세로로 합치기 - 10 (이미지 파일 필터)

이미지 파일만 드래그 되도록 만들어 보자. 폴더에 있는 파일을 전체 선택해서 드래그해서 리스트 위젯에 넣더라도 프로그램이 자동으로 이미지파일만 선별해서 넣도록 해보자. 1. 함수 생성 a.

udangco-coding-record.tistory.com

 

결과물

 

1. icon을 활용

    def dropEvent(self, event):
        img_file = self.find_img(event.mimeData())
        if img_file:
            if event.mimeData().hasUrls():
                event.setDropAction(Qt.CopyAction)
                event.accept()
                for file in img_file:
                    icon = QtGui.QIcon(str(file.toLocalFile()))  # 아이콘 형태로 이미지 가져오기
                    show_file = QtWidgets.QListWidgetItem(str(file.toLocalFile()))
                    self.addItem(show_file)
            else:
                event.ignore()
        else:
            event.ignore()

 

dropEvent 함수의 for loop에

icon 변수에

QtGui.QIcon: 아이콘 형태로 이미지를

str(file.toLacoalFile()): 파일 경로에서 가져오라

 

2. show_file 변경

show_file = QtWidgets.QListWidgetItem(icon, str(file.toLocalFile()))

icon 아래에 show_file안에 icon, 을 추가해 주자.

 

3. 썸네일 사이즈 변경

이대로 실행하면 썸네일이 너무 작다.

사이즈를 넓이 50, 높이 50으로 변경해 보자.

 

ListBoxWidget의 __init__ 함수 아래에 self.setIconSize(QSize(50, 50))을 추가하자.

class ListBoxWidget(QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)
        self.setIconSize(QSize(50, 50))  # 썸네일 사이즈 변경

 

 

전체코드

import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QSize, Qt, QMimeDatabase
from PyQt5.QtWidgets import QMainWindow, QMessageBox, QListWidget
import mimetypes


# drag and drop event. 파일 위치 경로를 가져오기
class ListBoxWidget(QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)
        self.setIconSize(QSize(50, 50))  # 썸네일 사이즈 변경

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        img_file = self.find_img(event.mimeData())
        if img_file:
            if event.mimeData().hasUrls():
                event.setDropAction(Qt.CopyAction)
                event.accept()
                for file in img_file:
                    icon = QtGui.QIcon(str(file.toLocalFile()))  # 아이콘 형태로 이미지 가져오기
                    show_file = QtWidgets.QListWidgetItem(icon, str(file.toLocalFile()))
                    self.addItem(show_file)
            else:
                event.ignore()
        else:
            event.ignore()

    def find_img(self, mimedata):
        file_list = list()
        db = QMimeDatabase()
        for file in mimedata.urls():
            mimetype = db.mimeTypeForUrl(file)  # pyqt mimetype 이용
            mimetype_e = mimetypes.guess_type(file.toString())[0]

            if (mimetype.name() == "image/bmp") or (mimetype.name() == "image/gif") or (mimetype.name() == "image/jpeg") or (mimetype.name() == "image/png"):
                file_list.append(file)
            elif (mimetype_e == "image/bmp") or (mimetype_e == "image/gif") or (mimetype_e == "image/jpeg") or (mimetype_e == "image/png"):
                file_list.append(file)
            else:
                pass
        return file_list

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(690, 641)
        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(30, 30, 631, 51))
        self.groupBox.setObjectName("groupBox")
        self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit.setGeometry(QtCore.QRect(10, 20, 151, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.groupBox_2 = QtWidgets.QGroupBox(Form)
        self.groupBox_2.setGeometry(QtCore.QRect(30, 90, 631, 51))
        self.groupBox_2.setObjectName("groupBox_2")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox_2)
        self.lineEdit_2.setGeometry(QtCore.QRect(10, 20, 541, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.groupBox_3 = QtWidgets.QGroupBox(Form)
        self.groupBox_3.setGeometry(QtCore.QRect(30, 150, 631, 411))
        self.groupBox_3.setObjectName("groupBox_3")
        self.listWidget = ListBoxWidget(self.groupBox_3)
        self.listWidget.setGeometry(QtCore.QRect(10, 20, 511, 371))
        self.listWidget.setObjectName("listWidget")
        self.pushButton = QtWidgets.QPushButton(self.groupBox_3)
        self.pushButton.setGeometry(QtCore.QRect(540, 20, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox_3)
        self.pushButton_2.setGeometry(QtCore.QRect(540, 50, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.groupBox_3)
        self.pushButton_3.setGeometry(QtCore.QRect(540, 80, 75, 23))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QtWidgets.QPushButton(Form)
        self.pushButton_4.setGeometry(QtCore.QRect(40, 570, 511, 41))
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_5 = QtWidgets.QPushButton(Form)
        self.pushButton_5.setGeometry(QtCore.QRect(570, 570, 71, 41))
        self.pushButton_5.setObjectName("pushButton_5")

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "이미지 합치기 v1.0"))
        self.groupBox.setTitle(_translate("Form", "가로 사이즈 (px)"))
        self.groupBox_2.setTitle(_translate("Form", "파일명"))
        self.lineEdit_2.setPlaceholderText(_translate("Form", "확장자를 제외한 파일명을 입력해 주세요."))
        self.groupBox_3.setTitle(_translate("Form", "이미지"))
        self.pushButton.setText(_translate("Form", "위 이동"))
        self.pushButton_2.setText(_translate("Form", "아래 이동"))
        self.pushButton_3.setText(_translate("Form", "제거"))
        self.pushButton_4.setText(_translate("Form", "합치기"))
        self.pushButton_5.setText(_translate("Form", "초기화"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

 

 

실행해보면 썸네일이 잘 들어오는 것까지 확인될 것이다.

 

하지만 버튼을 아무리 눌러도 아무런 변화가 없다.

버튼에 들어갈 함수를 만들어 보자.

 

Python 이미지 세로로 합치기 - 12 (버튼 함수 만들기)

각 버튼이 작동하도록 함수를 만들자 아직 이미지 썸네일이 나오게 하지 못했다면 아래 글 참고 [파이썬] - Python 이미지 세로로 합치기 - 11 (이미지 썸네일 표시) 버튼 함수 만들기 1. 각 버튼 및

udangco-coding-record.tistory.com

 

반응형