파일 이름 일괄 변경 프로그램 만들기 > 파이썬 응용

본문 바로가기
사이트 내 전체검색

회원로그인

올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구

파이썬 응용

파일 이름 일괄 변경 프로그램 만들기

페이지정보

글쓴이 관리자 조회 27,018 조회 날짜 20-01-29 22:24 / Update:20-02-17 17:06
댓글 0 댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

내용

파일 이름 일괄 변경 프로그램 만들기

 

목록에서 파일을 불러서 이름을 일괄적으로 변경하는 프로그램을 만들어 보자.

 

 

1. 기능 명세

 

1) 파일 목록 불러오기 기능

2) 문자열 바꾸기 기능

3) 파일 이름 앞에 문자 추가하기

4) 파일 이름 뒤에 문자 추가하기

5) 이미지의 EXIF의 생성 시간으로 이름 변경

6) 변경된 이름 적용하기

7) 변경된 이름 취소

 

 

2. 목록에 표시될 정보

 

1) 현재 이름

2) 변경 이름

3) 파일 경로

4) 파일 크기

5) 변경 시각

 

 

 

3. 디자인 파일 만들기

 

1) 메인 화면

아래와 같은 모양으로 ui 파일을 만든다.

2921058436_1580362819.922.png

 

filename = filenamechange.ui

ObjectName 

파일목록불러오기 = BTN_list

문자열바꾸기= BTN_replace

앞문자추가 = BTN_frontadd

뒷문자추가 = BTN_backadd

EXIF생성시각 = BTN_exif

변경적용 = BTN_excute

변경취소 = BTN_cancel

테이블 위젯 = TW_list

 

 

2) 문자열 바꾸기 폼

2921058436_1580363451.5986.png

 

filename = filenamechange_replace.ui

ObjectName 

이전 문자열 라인에디트 = LE_prev

이후 문자열 라인에디트= LE_new

확인 = BTN_confirm

취소 = BTN_cancel

 

 

3) 앞문자 추가  폼

2921058436_1580363730.5823.png

 

filename = filenamechange_front.ui

ObjectName 

문자열 라인에디트 = LE_str

확인 = BTN_confirm

취소 = BTN_cancel

 

 

4) 뒷문자 추가 폼

2921058436_1580363796.1828.png

 

filename = filenamechange_back.ui

ObjectName 

문자열 라인에디트 = LE_str

확인 = BTN_confirm

취소 = BTN_cancel

 

총 4개의 ui 파일을 만든다.

2921058436_1580366701.791.png

 

 

 

4. 코드 구현

 

추가되는 기능은 붉은색 굵은 글씨체로 코드를 추가하였으니, 추가된 붉은 글씨를 보면서 따라하면 이해하기 쉬울 것이다.

 

1) UI 화면 구성 및 Table Widget 칼럼 이름 설정

import sys
import os
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow, QHeaderView


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

 

    def setupUI(self):
        global UI_MAIN, UI_REPLACE, UI_FRONT, UI_BACK

 

        # 메인 화면
        UI_MAIN = QtUiTools.QUiLoader().load(resource_path("filenamechange.ui"))

 

        # 문자열 바꾸기 화면
        UI_REPLACE = QtUiTools.QUiLoader().load(resource_path("filenamechange_replace.ui"))
        UI_REPLACE.setWindowTitle("문자열 변경")
        # 앞문자 추가 화면
        UI_FRONT = QtUiTools.QUiLoader().load(resource_path("filenamechange_front.ui"))
        UI_FRONT.setWindowTitle("앞에 문자 추가")
        # 뒷문자 추가 화면
        UI_BACK = QtUiTools.QUiLoader().load(resource_path("filenamechange_back.ui"))
        UI_BACK.setWindowTitle("뒤에 문자 추가")

 

        # 테이블 위젯 컬럼 이름 설정
        UI_MAIN.TW_list.setHorizontalHeaderLabels(['현재이름','변경이름','파일경로','파일크기','변경시각'])

        # 테이블 헤더 사이즈 늘리기

        UI_MAIN.TW_list.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

 

        self.setCentralWidget(UI_MAIN)
        self.setWindowTitle("파일 이름 변경 프로그램")
        self.resize(800, 600)
        self.show()


# 파일 경로
# pyinstaller로 원파일로 압축할때 경로 필요함
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    # main.show()
    sys.exit(app.exec_())

 

실행화면

2921058436_1580364657.6164.png

 

 

2) 파일 목록 불러오기 기능

파일 목록은 파일 다이얼로그를 이용하여 다수의 파일을 리스트로 읽어온다.

관련 기능은 https://www.jbmpa.com/pyside2/9에서 확인한다.

 

파일 다이얼로그에서 파일 목록을 선택하면, 선택된 파일들의 이름과 경로, 크기, 변경 시각등을 수집하여 테이블 위젯에 출력해준다.

import sys
import os
import datetime
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow, QHeaderView, QFileDialog, QTableWidgetItem


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()
        self.setButtons()

 

    def setupUI(self):
        global UI_MAIN, UI_REPLACE, UI_FRONT, UI_BACK

 

        # 메인 화면
        UI_MAIN = QtUiTools.QUiLoader().load(resource_path("filenamechange.ui"))

 

        # 문자열 바꾸기 화면
        UI_REPLACE = QtUiTools.QUiLoader().load(resource_path("filenamechange_replace.ui"))
        UI_REPLACE.setWindowTitle("문자열 변경")
        # 앞문자 추가 화면
        UI_FRONT = QtUiTools.QUiLoader().load(resource_path("filenamechange_front.ui"))
        UI_FRONT.setWindowTitle("앞에 문자 추가")
        # 뒷문자 추가 화면
        UI_BACK = QtUiTools.QUiLoader().load(resource_path("filenamechange_back.ui"))
        UI_BACK.setWindowTitle("뒤에 문자 추가")

 

        # 테이블 위젯 컬럼 이름 설정
        UI_MAIN.TW_list.setHorizontalHeaderLabels(['현재이름','변경이름','파일경로','파일크기','변경시각'])

        # 테이블 헤더 사이즈 늘리기

        UI_MAIN.TW_list.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

 

        self.setCentralWidget(UI_MAIN)
        self.setWindowTitle("파일 이름 변경 프로그램")
        self.resize(800, 600)
        self.show()

 

    def setButtons(self):
        UI_MAIN.BTN_list.clicked.connect(self.FilesOpen)


    # Non static function 다중 파일
    def FilesOpen(self):
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.ExistingFiles)
        dialog.setNameFilter(self.tr("Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec_():
            fileNames = dialog.selectedFiles()
            # 파일 목록을 테이블 위젯에 넣기 위해 setList 함수 호출
            setList(fileNames)


def setList(fileNames):
    # 파일 목록 갯수 저장
    count = len(fileNames)
    # 파일 목록 갯수만큼 row 생성
    UI_MAIN.TW_list.setRowCount(count)

 

    # 파일 정보를 테이블 위젯에 삽입

    for i in range(count):
        # 파일 경로와 파일 이름
        dir, file = os.path.split(fileNames[i])
        # 파일 크기
        fsize = os.path.getsize(fileNames[i])

        # 변경 시각 - 유닉스 타임으로 반환
        mtime = os.path.getmtime(fileNames[i])

        # 유닉스 타임을 년월일시분초 형태로 변환 (1580628774 -> 2020-02-02 00:32:54)
        mtimestamp = datetime.datetime.fromtimestamp(int(mtime))

  

        # 테이블 아이템 입력
        UI_MAIN.TW_list.setItem(i, 0, QTableWidgetItem(file))
        UI_MAIN.TW_list.setItem(i, 1, QTableWidgetItem(file))
        UI_MAIN.TW_list.setItem(i, 2, QTableWidgetItem(dir))
        UI_MAIN.TW_list.setItem(i, 3, QTableWidgetItem(str(fsize)))
        UI_MAIN.TW_list.setItem(i, 4, QTableWidgetItem(str(mtimestamp)))


# 파일 경로
# pyinstaller로 원파일로 압축할때 경로 필요함
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    # main.show()
    sys.exit(app.exec_())

 

 

3) 문자열 바꾸기 기능

문자열 바꾸기 버튼을 클릭하면 문자열 변경 창이 나타난다.

변경하고 싶은 문자열을 입력하고 확인 버튼을 누르면, 목록의 변경이름에서 문자열을 변경하여 다시 저장해준다.

 

import sys
import os
import datetime
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow, QHeaderView, QFileDialog, QTableWidgetItem


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()
        self.setButtons()

 

    def setupUI(self):
        global UI_MAIN, UI_REPLACE, UI_FRONT, UI_BACK

 

        # 메인 화면
        UI_MAIN = QtUiTools.QUiLoader().load(resource_path("filenamechange.ui"))

        # 문자열 바꾸기 화면
        UI_REPLACE = QtUiTools.QUiLoader().load(resource_path("filenamechange_replace.ui"))
        UI_REPLACE.setWindowTitle("문자열 변경")
        # 앞문자 추가 화면
        UI_FRONT = QtUiTools.QUiLoader().load(resource_path("filenamechange_front.ui"))
        UI_FRONT.setWindowTitle("앞에 문자 추가")
        # 뒷문자 추가 화면
        UI_BACK = QtUiTools.QUiLoader().load(resource_path("filenamechange_back.ui"))
        UI_BACK.setWindowTitle("뒤에 문자 추가")

 

        # 테이블 위젯 컬럼 이름 설정
        UI_MAIN.TW_list.setHorizontalHeaderLabels(['현재이름','변경이름','파일경로','파일크기','변경시각'])

        # 테이블 헤더 사이즈 늘리기

        UI_MAIN.TW_list.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

 

        self.setCentralWidget(UI_MAIN)
        self.setWindowTitle("파일 이름 변경 프로그램")
        self.resize(800, 600)
        self.show()

 

    def setButtons(self):
        UI_MAIN.BTN_list.clicked.connect(self.FilesOpen)

 

        # 문자열 바꾸기 버튼 클릭
        UI_MAIN.BTN_replace.clicked.connect(self.NameReplaceFormOn)
        # 문자열 변경 창의 취소 버튼
        UI_REPLACE.BTN_cancel.clicked.connect(self.NameReplaceFormOff)
        # 문자열 변경 창의 확인 버튼
        UI_REPLACE.BTN_confirm.clicked.connect(NameReplace)


    # Non static function 다중 파일
    def FilesOpen(self):
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.ExistingFiles)
        dialog.setNameFilter(self.tr("Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec_():
            fileNames = dialog.selectedFiles()
            # 파일 목록을 테이블 위젯에 넣기 위해 setList 함수 호출
            setList(fileNames)

 

    # 문자열 바꾸기 버튼 클릭, 문자열 변경 창을 보여준다.
    def NameReplaceFormOn(self):
        UI_REPLACE.show()

        UI_REPLACE.activateWindow()

    # 문자열 변경 창에서 취소 클릭, 문자열 변경 창을 사라지게 한다.
    def NameReplaceFormOff(self):
        UI_REPLACE.close()

 

def NameReplace():
    # 문자열 변경창에서 확인 버튼이 눌렸을 때
    # 변경될 문자열
    str_prev = UI_REPLACE.LE_prev.text()
    # 변경할 문자열
    str_new = UI_REPLACE.LE_new.text()

 

    # 테이블 위젯의 row count 만큼 반복하며 변경 이름의 텍스트를 변경하여 다시 저장한다.
    # 테이블 위젯의 row count
    rowcount = UI_MAIN.TW_list.rowCount()
    # 테이블 row 수만큼 반복
    for i in range(rowcount):
        # 변경이름의 값을 받아온다.
        prevname = UI_MAIN.TW_list.item(i, 1).text()
        # 변경이름에서 변경할 문자열을 변경한다.
        newname = prevname.replace(str_prev, str_new)

        # 변경이름에 다시 입력한다.
        UI_MAIN.TW_list.item(i, 1).setText(newname)

    

    # 작업을 마치고 창을 닫는다.

    UI_REPLACE.close()


def setList(fileNames):
    # 파일 목록 갯수 저장
    count = len(fileNames)
    # 파일 목록 갯수만큼 row 생성
    UI_MAIN.TW_list.setRowCount(count)

 

    # 파일 정보를 테이블 위젯에 삽입

    for i in range(count):
        # 파일 경로와 파일 이름
        dir, file = os.path.split(fileNames[i])
        # 파일 크기
        fsize = os.path.getsize(fileNames[i])

        # 변경 시각 - 유닉스 타임으로 반환
        mtime = os.path.getmtime(fileNames[i])

        # 유닉스 타임을 년월일시분초 형태로 변환 (1580628774 -> 2020-02-02 00:32:54)
        mtimestamp = datetime.datetime.fromtimestamp(int(mtime))

 

        # 테이블 아이템 입력
        UI_MAIN.TW_list.setItem(i, 0, QTableWidgetItem(file))
        UI_MAIN.TW_list.setItem(i, 1, QTableWidgetItem(file))
        UI_MAIN.TW_list.setItem(i, 2, QTableWidgetItem(dir))
        UI_MAIN.TW_list.setItem(i, 3, QTableWidgetItem(str(fsize)))
        UI_MAIN.TW_list.setItem(i, 4, QTableWidgetItem(str(mtimestamp)))


# 파일 경로
# pyinstaller로 원파일로 압축할때 경로 필요함
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    # main.show()
    sys.exit(app.exec_())

 

 

4) 앞 문자 추가하기 기능

앞문자 추가  버튼을 클릭하면 앞문자 추가 창이 나타난다.

파일 이름 앞에 추가하고 싶은 문자열을 입력하고 확인 버튼을 누르면, 목록의 변경이름에서 문자열을 변경하여 다시 저장해준다.

 

import sys
import os
import datetime
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow, QHeaderView, QFileDialog, QTableWidgetItem


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()
        self.setButtons()

 

    def setupUI(self):
        global UI_MAIN, UI_REPLACE, UI_FRONT, UI_BACK

 

        # 메인 화면
        UI_MAIN = QtUiTools.QUiLoader().load(resource_path("filenamechange.ui"))

        # 문자열 바꾸기 화면
        UI_REPLACE = QtUiTools.QUiLoader().load(resource_path("filenamechange_replace.ui"))
        UI_REPLACE.setWindowTitle("문자열 변경")
        # 앞문자 추가 화면
        UI_FRONT = QtUiTools.QUiLoader().load(resource_path("filenamechange_front.ui"))
        UI_FRONT.setWindowTitle("앞에 문자 추가")
        # 뒷문자 추가 화면
        UI_BACK = QtUiTools.QUiLoader().load(resource_path("filenamechange_back.ui"))
        UI_BACK.setWindowTitle("뒤에 문자 추가")

 

        # 테이블 위젯 컬럼 이름 설정
        UI_MAIN.TW_list.setHorizontalHeaderLabels(['현재이름','변경이름','파일경로','파일크기','변경시각'])

        # 테이블 헤더 사이즈 늘리기

        UI_MAIN.TW_list.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

 

        self.setCentralWidget(UI_MAIN)
        self.setWindowTitle("파일 이름 변경 프로그램")
        self.resize(800, 600)
        self.show()

 

    def setButtons(self):
        UI_MAIN.BTN_list.clicked.connect(self.FilesOpen)

 

        # 문자열 바꾸기 버튼 클릭
        UI_MAIN.BTN_replace.clicked.connect(self.NameReplaceFormOn)
        # 문자열 변경 창의 취소 버튼
        UI_REPLACE.BTN_cancel.clicked.connect(self.NameReplaceFormOff)
        # 문자열 변경 창의 확인 버튼
        UI_REPLACE.BTN_confirm.clicked.connect(NameReplace)

 

        # 앞문자 추가
        UI_MAIN.BTN_frontadd.clicked.connect(self.FrontaddFormOn)
        # 앞문자 추가 창의 취소 버튼
        UI_FRONT.BTN_cancel.clicked.connect(self.FrontaddFormOff)
        # 앞문자 추가 창의 확인 버튼
        UI_FRONT.BTN_confirm.clicked.connect(Frontadd)


    # Non static function 다중 파일
    def FilesOpen(self):
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.ExistingFiles)
        dialog.setNameFilter(self.tr("Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec_():
            fileNames = dialog.selectedFiles()
            # 파일 목록을 테이블 위젯에 넣기 위해 setList 함수 호출
            setList(fileNames)

 

    # 문자열 바꾸기 버튼 클릭, 문자열 변경 창을 보여준다.
    def NameReplaceFormOn(self):
        UI_REPLACE.show()

        UI_REPLACE.activateWindow()

    # 문자열 변경 창에서 취소 클릭, 문자열 변경 창을 사라지게 한다.
    def NameReplaceFormOff(self):
        UI_REPLACE.close()


    # 앞문자 추가 클릭, 앞문자 추가 창을 보여준다.
    def FrontaddFormOn(self):
        UI_FRONT.show()

        UI_FRONT.activateWindow()

    # 앞문자 추가 창에서 취소 클릭, 앞문자 추가 창을 사라지게 한다.
    def FrontaddFormOff(self):
        UI_FRONT.close()

 

def Frontadd():
    # 파일 이름 앞에 추가할 문자열
    str_new = UI_FRONT.LE_str.text()

 

    # 테이블 위젯의 row count 만큼 반복하며 변경 이름의 텍스트를 변경하여 다시 저장한다.
    # 테이블 위젯의 row count
    rowcount = UI_MAIN.TW_list.rowCount()
    # 테이블 row 수만큼 반복
    for i in range(rowcount):
        # 변경이름의 값을 받아온다.
        prevname = UI_MAIN.TW_list.item(i, 1).text()
        # 변경이름에서 변경할 문자열을 변경한다.
        newname = str_new + prevname

 

        # 변경이름에 다시 입력한다.
        UI_MAIN.TW_list.item(i, 1).setText(newname)

 

    # 작업을 마치고 창을 닫는다.
    UI_FRONT.close()

 

def NameReplace():
    # 문자열 변경창에서 확인 버튼이 눌렸을 때
    # 변경될 문자열
    str_prev = UI_REPLACE.LE_prev.text()
    # 변경할 문자열
    str_new = UI_REPLACE.LE_new.text()

 

    # 테이블 위젯의 row count 만큼 반복하며 변경 이름의 텍스트를 변경하여 다시 저장한다.
    # 테이블 위젯의 row count
    rowcount = UI_MAIN.TW_list.rowCount()
    # 테이블 row 수만큼 반복
    for i in range(rowcount):
        # 변경이름의 값을 받아온다.
        prevname = UI_MAIN.TW_list.item(i, 1).text()
        # 변경이름에서 변경할 문자열을 변경한다.
        newname = prevname.replace(str_prev, str_new)

        # 변경이름에 다시 입력한다.
        UI_MAIN.TW_list.item(i, 1).setText(newname)

    

    # 작업을 마치고 창을 닫는다.

    UI_REPLACE.close()


def setList(fileNames):
    # 파일 목록 갯수 저장
    count = len(fileNames)
    # 파일 목록 갯수만큼 row 생성
    UI_MAIN.TW_list.setRowCount(count)

 

    # 파일 정보를 테이블 위젯에 삽입

    for i in range(count):
        # 파일 경로와 파일 이름
        dir, file = os.path.split(fileNames[i])
        # 파일 크기
        fsize = os.path.getsize(fileNames[i])

        # 변경 시각 - 유닉스 타임으로 반환
        mtime = os.path.getmtime(fileNames[i])

        # 유닉스 타임을 년월일시분초 형태로 변환 (1580628774 -> 2020-02-02 00:32:54)
        mtimestamp = datetime.datetime.fromtimestamp(int(mtime))

 

        # 테이블 아이템 입력
        UI_MAIN.TW_list.setItem(i, 0, QTableWidgetItem(file))
        UI_MAIN.TW_list.setItem(i, 1, QTableWidgetItem(file))
        UI_MAIN.TW_list.setItem(i, 2, QTableWidgetItem(dir))
        UI_MAIN.TW_list.setItem(i, 3, QTableWidgetItem(str(fsize)))
        UI_MAIN.TW_list.setItem(i, 4, QTableWidgetItem(str(mtimestamp)))


# 파일 경로
# pyinstaller로 원파일로 압축할때 경로 필요함
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    # main.show()
    sys.exit(app.exec_())

 

 

5) 뒷 문자 추가하기 기능

뒷문자 추가  버튼을 클릭하면 뒷문자 추가 창이 나타난다.

파일 이름 뒤에 추가하고 싶은 문자열을 입력하고 확인 버튼을 누르면, 목록의 변경이름에서 문자열을 변경하여 다시 저장해준다.

 

import sys
import os
import datetime
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow, QHeaderView, QFileDialog, QTableWidgetItem


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()
        self.setButtons()

 

    def setupUI(self):
        global UI_MAIN, UI_REPLACE, UI_FRONT, UI_BACK

 

        # 메인 화면
        UI_MAIN = QtUiTools.QUiLoader().load(resource_path("filenamechange.ui"))

        # 문자열 바꾸기 화면
        UI_REPLACE = QtUiTools.QUiLoader().load(resource_path("filenamechange_replace.ui"))
        UI_REPLACE.setWindowTitle("문자열 변경")
        # 앞문자 추가 화면
        UI_FRONT = QtUiTools.QUiLoader().load(resource_path("filenamechange_front.ui"))
        UI_FRONT.setWindowTitle("앞에 문자 추가")
        # 뒷문자 추가 화면
        UI_BACK = QtUiTools.QUiLoader().load(resource_path("filenamechange_back.ui"))
        UI_BACK.setWindowTitle("뒤에 문자 추가")

 

        # 테이블 위젯 컬럼 이름 설정
        UI_MAIN.TW_list.setHorizontalHeaderLabels(['현재이름','변경이름','파일경로','파일크기','변경시각'])

        # 테이블 헤더 사이즈 늘리기

        UI_MAIN.TW_list.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

 

        self.setCentralWidget(UI_MAIN)
        self.setWindowTitle("파일 이름 변경 프로그램")
        self.resize(800, 600)
        self.show()

 

    def setButtons(self):
        UI_MAIN.BTN_list.clicked.connect(self.FilesOpen)

 

        # 문자열 바꾸기 버튼 클릭
        UI_MAIN.BTN_replace.clicked.connect(self.NameReplaceFormOn)
        # 문자열 변경 창의 취소 버튼
        UI_REPLACE.BTN_cancel.clicked.connect(self.NameReplaceFormOff)
        # 문자열 변경 창의 확인 버튼
        UI_REPLACE.BTN_confirm.clicked.connect(NameReplace)

 

        # 앞문자 추가
        UI_MAIN.BTN_frontadd.clicked.connect(self.FrontaddFormOn)
        # 앞문자 추가 창의 취소 버튼
        UI_FRONT.BTN_cancel.clicked.connect(self.FrontaddFormOff)
        # 앞문자 추가 창의 확인 버튼
        UI_FRONT.BTN_confirm.clicked.connect(Frontadd)

 

        # 뒷문자 추가
        UI_MAIN.BTN_backadd.clicked.connect(self.BackaddFormOn)
        # 뒷문자 추가 창의 취소 버튼
        UI_BACK.BTN_cancel.clicked.connect(self.BackaddFormOff)
        # 뒷문자 추가 창의 확인 버튼
        UI_BACK.BTN_confirm.clicked.connect(Backadd)


    # Non static function 다중 파일
    def FilesOpen(self):
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.ExistingFiles)
        dialog.setNameFilter(self.tr("Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec_():
            fileNames = dialog.selectedFiles()
            # 파일 목록을 테이블 위젯에 넣기 위해 setList 함수 호출
            setList(fileNames)

 

    # 문자열 바꾸기 버튼 클릭, 문자열 변경 창을 보여준다.
    def NameReplaceFormOn(self):
        UI_REPLACE.show()

        UI_REPLACE.activateWindow()

    # 문자열 변경 창에서 취소 클릭, 문자열 변경 창을 사라지게 한다.
    def NameReplaceFormOff(self):
        UI_REPLACE.close()


    # 앞문자 추가 클릭, 앞문자 추가 창을 보여준다.
    def FrontaddFormOn(self):
        UI_FRONT.show()

        UI_FRONT.activateWindow()

    # 앞문자 추가 창에서 취소 클릭, 앞문자 추가 창을 사라지게 한다.
    def FrontaddFormOff(self):
        UI_FRONT.close()

 

    # 뒷문자 추가 클릭, 뒷문자 추가 창을 보여준다.
    def BackaddFormOn(self):
        UI_BACK.show()

        UI_BACK.activateWindow()

    # 뒷문자 추가 창에서 취소 클릭, 뒷문자 추가 창을 사라지게 한다.
    def BackaddFormOff(self):
        UI_BACK.close()

 

def Backadd():
    # 파일 이름 뒤에 추가할 문자열
    str_new = UI_BACK.LE_str.text()

 

    # 테이블 위젯의 row count 만큼 반복하며 변경 이름의 텍스트를 변경하여 다시 저장한다.
    # 테이블 위젯의 row count
    rowcount = UI_MAIN.TW_list.rowCount()
    # 테이블 row 수만큼 반복
    for i in range(rowcount):
        # 변경이름의 값을 받아온다.
        prevname = UI_MAIN.TW_list.item(i, 1).text()

 

        # 파일 이름과 확장자를 구분한다.
        tempname = prevname.split(".")
        # 변경이름에서 변경할 문자열을 변경한다.
        newname = tempname[0] + str_new + "." + tempname[1]

 

        # 변경이름에 다시 입력한다.
        UI_MAIN.TW_list.item(i, 1).setText(newname)

 

    # 작업을 마치고 창을 닫는다.
    UI_BACK.close()

 

def Frontadd():
    # 파일 이름 앞에 추가할 문자열
    str_new = UI_FRONT.LE_str.text()

 

    # 테이블 위젯의 row count 만큼 반복하며 변경 이름의 텍스트를 변경하여 다시 저장한다.
    # 테이블 위젯의 row count
    rowcount = UI_MAIN.TW_list.rowCount()
    # 테이블 row 수만큼 반복
    for i in range(rowcount):
        # 변경이름의 값을 받아온다.
        prevname = UI_MAIN.TW_list.item(i, 1).text()
        # 변경이름에서 변경할 문자열을 변경한다.
        newname = str_new + prevname

 

        # 변경이름에 다시 입력한다.
        UI_MAIN.TW_list.item(i, 1).setText(newname)

 

    # 작업을 마치고 창을 닫는다.
    UI_FRONT.close()

 

def NameReplace():
    # 문자열 변경창에서 확인 버튼이 눌렸을 때
    # 변경될 문자열
    str_prev = UI_REPLACE.LE_prev.text()
    # 변경할 문자열
    str_new = UI_REPLACE.LE_new.text()

 

    # 테이블 위젯의 row count 만큼 반복하며 변경 이름의 텍스트를 변경하여 다시 저장한다.
    # 테이블 위젯의 row count
    rowcount = UI_MAIN.TW_list.rowCount()
    # 테이블 row 수만큼 반복
    for i in range(rowcount):
        # 변경이름의 값을 받아온다.
        prevname = UI_MAIN.TW_list.item(i, 1).text()
        # 변경이름에서 변경할 문자열을 변경한다.
        newname = prevname.replace(str_prev, str_new)

        # 변경이름에 다시 입력한다.
        UI_MAIN.TW_list.item(i, 1).setText(newname)

    

    # 작업을 마치고 창을 닫는다.

    UI_REPLACE.close()


def setList(fileNames):
    # 파일 목록 갯수 저장
    count = len(fileNames)
    # 파일 목록 갯수만큼 row 생성
    UI_MAIN.TW_list.setRowCount(count)

 

    # 파일 정보를 테이블 위젯에 삽입

    for i in range(count):
        # 파일 경로와 파일 이름
        dir, file = os.path.split(fileNames[i])
        # 파일 크기
        fsize = os.path.getsize(fileNames[i])

        # 변경 시각 - 유닉스 타임으로 반환
        mtime = os.path.getmtime(fileNames[i])

        # 유닉스 타임을 년월일시분초 형태로 변환 (1580628774 -> 2020-02-02 00:32:54)
        mtimestamp = datetime.datetime.fromtimestamp(int(mtime))
  

        # 테이블 아이템 입력
        UI_MAIN.TW_list.setItem(i, 0, QTableWidgetItem(file))
        UI_MAIN.TW_list.setItem(i, 1, QTableWidgetItem(file))
        UI_MAIN.TW_list.setItem(i, 2, QTableWidgetItem(dir))
        UI_MAIN.TW_list.setItem(i, 3, QTableWidgetItem(str(fsize)))
        UI_MAIN.TW_list.setItem(i, 4, QTableWidgetItem(str(mtimestamp)))


# 파일 경로
# pyinstaller로 원파일로 압축할때 경로 필요함
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    # main.show()
    sys.exit(app.exec_())

 

 

 

### 다음 강좌로 이어짐 ###

https://www.jbmpa.com/python_advanced/5

 

댓글목록 sfs

총 6 건 , 1 페이지
게시물 검색
GNUBOARD_M
Copyright © JBMPA.com All rights reserved.