파이썬으로 이미지 시퀀스 또는 UDIM 텍스쳐 이미지들의 원하는 구간을 복사해주는 유틸 제작하기(Multiple_Files_Duplicator_with_UI_for_Windows_v1.0)


파이썬으로 이미지 시퀀스 또는 UDIM 텍스쳐 이미지들의 원하는 구간을 복사해주는 유틸 제작하기

 

필요한 파이썬 패키지 설치하기

이 스크립트는 파이썬의 표준 라이브러리인 os, shutil, tkinter를 사용합니다. tkinter는 일부 시스템에서 기본적으로 설치되어 있지 않을 수 있으므로, 다음과 같이 설치할 수 있습니다.

pip install tk

 

코드 분석 및 설명

라이브러리 불러오기

# 필요한 라이브러리를 불러옵니다.
import os
import shutil
import tkinter as tk
from tkinter import filedialog

 

파일 선택 및 복사 함수

# 파일을 선택하고 복사하는 함수입니다.
def select_and_copy_files():
    source_dir = os.path.join(source_base_dir_entry.get(), source_folder_name_entry.get())
    target_dir = os.path.join(target_base_dir_entry.get(), target_folder_name_entry.get())
    start_num = int(start_num_entry.get())
    end_num = int(end_num_entry.get())

    for filename in os.listdir(source_dir):
        file_base, file_ext = os.path.splitext(filename)
        file_num_str = ''.join(filter(str.isdigit, file_base))

        if file_num_str.isdigit() and start_num <= int(file_num_str) <= end_num:
            source_file_path = os.path.join(source_dir, filename)
            target_file_path = os.path.join(target_dir, filename)
            shutil.copy2(source_file_path, target_file_path)
            result_label.config(text="모든 복사를 완료했습니다.")

 

사용자 인터페이스 구성

이 부분에서는 tkinter를 사용하여 각종 입력 필드, 버튼, 레이블을 설정하고, 그리드 형태로 화면에 배치합니다. 사용자는 이 인터페이스를 통해 원하는 작업을 쉽게 설정할 수 있습니다.

 

 







 

전체 코드

# 필요한 라이브러리를 임포트합니다.
import os
import shutil
import tkinter as tk
from tkinter import filedialog

# 파일을 선택하고 복사하는 함수입니다.
def select_and_copy_files():
    # 사용자가 입력한 디렉토리 경로와 폴더 이름을 결합하여 전체 경로를 구성합니다.
    source_dir = os.path.join(source_base_dir_entry.get(), source_folder_name_entry.get())
    target_dir = os.path.join(target_base_dir_entry.get(), target_folder_name_entry.get())
    # 사용자로부터 입력받은 시작 번호와 끝 번호를 정수로 변환합니다.
    start_num = int(start_num_entry.get())
    end_num = int(end_num_entry.get())

    # 원본 디렉토리의 파일들을 순회합니다.
    for filename in os.listdir(source_dir):
        # 파일 이름에서 확장자를 분리합니다.
        file_base, file_ext = os.path.splitext(filename)
        # 파일 이름에서 숫자 부분만 추출합니다.
        file_num_str = ''.join(filter(str.isdigit, file_base))

        # 추출된 숫자가 지정된 범위 내에 있는지 확인합니다.
        if file_num_str.isdigit() and start_num <= int(file_num_str) <= end_num:
            # 원본과 대상 파일의 전체 경로를 구성합니다.
            source_file_path = os.path.join(source_dir, filename)
            target_file_path = os.path.join(target_dir, filename)
            # 파일을 복사합니다.
            shutil.copy2(source_file_path, target_file_path)
            # 결과를 사용자에게 알립니다.
            result_label.config(text=f"모든 복사를 완료했습니다.")

# 원본 디렉토리를 탐색하고 선택하는 함수입니다.
def browse_source_dir():
    source_base_dir_entry.delete(0, tk.END)
    source_base_dir_entry.insert(0, filedialog.askdirectory())

# 대상 디렉토리를 탐색하고 선택하는 함수입니다.
def browse_target_dir():
    target_base_dir_entry.delete(0, tk.END)
    target_base_dir_entry.insert(0, filedialog.askdirectory())

# UI를 구성하는 부분입니다.
window = tk.Tk()
window.title("파일 선택 및 복사")

# 각종 레이블과 입력 필드, 버튼을 생성하고 위치시킵니다.
source_base_dir_label = tk.Label(window, text="원본 기본 디렉토리:")
source_base_dir_label.grid(row=0, column=0)
source_base_dir_entry = tk.Entry(window, width=50)
source_base_dir_entry.grid(row=0, column=1)
source_browse_button = tk.Button(window, text="찾아보기", command=browse_source_dir)
source_browse_button.grid(row=0, column=2)

source_folder_name_label = tk.Label(window, text="원본 폴더 이름:")
source_folder_name_label.grid(row=1, column=0)
source_folder_name_entry = tk.Entry(window, width=50)
source_folder_name_entry.grid(row=1, column=1)

target_base_dir_label = tk.Label(window, text="대상 기본 디렉토리:")
target_base_dir_label.grid(row=2, column=0)
target_base_dir_entry = tk.Entry(window, width=50)
target_base_dir_entry.grid(row=2, column=1)
target_browse_button = tk.Button(window, text="찾아보기", command=browse_target_dir)
target_browse_button.grid(row=2, column=2)

target_folder_name_label = tk.Label(window, text="대상 폴더 이름:")
target_folder_name_label.grid(row=3, column=0)
target_folder_name_entry = tk.Entry(window, width=50)
target_folder_name_entry.grid(row=3, column=1)

start_num_label = tk.Label(window, text="시작 번호:")
start_num_label.grid(row=4, column=0)
start_num_entry = tk.Entry(window, width=10)
start_num_entry.grid(row=4, column=1)

end_num_label = tk.Label(window, text="끝 번호:")
end_num_label.grid(row=5, column=0)
end_num_entry = tk.Entry(window, width=10)
end_num_entry.grid(row=5, column=1)

copy_button = tk.Button(window, text="복사", command=select_and_copy_files)
copy_button.grid(row=6, column=1)

result_label = tk.Label(window, text="")
result_label.grid(row=7, column=1)

# 애플리케이션의 메인 이벤트 루프를 시작합니다.
window.mainloop()

 

아래는 위 코드에서 사용된 모든 Python 함수 및 명령어들입니다.

표준 라이브러리

  1. 🔗import os: 운영 체제와 상호 작용하는 다양한 기능을 제공하는 모듈.
    • os.path.join: 파일 경로를 결합하는 함수.
    • os.listdir: 디렉토리 내의 파일 및 디렉토리 목록을 반환하는 함수.
    • os.path.splitext: 파일 이름과 확장자를 분리하는 함수.
  2. 🔗import shutil: 파일 및 디렉토리 작업을 위한 고수준의 기능을 제공하는 모듈.
    • shutil.copy2: 파일을 복사하면서 메타데이터(예: 타임스탬프)를 유지하는 함수.
  3. 🔗import tkinter as tk: GUI 애플리케이션을 만드는 데 사용되는 모듈.
    • tk.Tk: 애플리케이션 창을 생성하는 클래스.
    • tk.Label: 텍스트 레이블을 생성하는 클래스.
    • tk.Entry: 단일 줄 텍스트 입력 필드를 생성하는 클래스.
    • tk.Button: 버튼을 생성하는 클래스.
    • tk.filedialog.askdirectory: 디렉토리 선택 대화 상자를 여는 함수.

 

함수 정의

  1. 🔗select_and_copy_files(): 파일을 선택하고 지정된 범위 내의 파일들을 복사하는 함수.
    • source_base_dir_entry.get(): 원본 기본 디렉토리 입력 필드에서 사용자가 입력한 값을 가져오는 메서드.
    • source_folder_name_entry.get(): 원본 폴더 이름 입력 필드에서 사용자가 입력한 값을 가져오는 메서드.
    • target_base_dir_entry.get(): 대상 기본 디렉토리 입력 필드에서 사용자가 입력한 값을 가져오는 메서드.
    • target_folder_name_entry.get(): 대상 폴더 이름 입력 필드에서 사용자가 입력한 값을 가져오는 메서드.
    • start_num_entry.get(): 시작 번호 입력 필드에서 사용자가 입력한 값을 가져오는 메서드.
    • end_num_entry.get(): 끝 번호 입력 필드에서 사용자가 입력한 값을 가져오는 메서드.
    • result_label.config(): 결과 레이블의 텍스트를 설정하는 메서드.
  2. 🔗browse_source_dir(): 원본 디렉토리를 탐색하고 선택하는 함수.
    • source_base_dir_entry.delete(0, tk.END): 원본 기본 디렉토리 입력 필드의 내용을 지우는 메서드.
    • source_base_dir_entry.insert(0, filedialog.askdirectory()): 디렉토리 선택 대화 상자를 열고 선택한 디렉토리 경로를 입력 필드에 삽입하는 메서드.
  3. 🔗browse_target_dir(): 대상 디렉토리를 탐색하고 선택하는 함수.
    • target_base_dir_entry.delete(0, tk.END): 대상 기본 디렉토리 입력 필드의 내용을 지우는 메서드.
    • target_base_dir_entry.insert(0, filedialog.askdirectory()): 디렉토리 선택 대화 상자를 열고 선택한 디렉토리 경로를 입력 필드에 삽입하는 메서드.

 

GUI 구성 요소

  1. 🔗window.title(): 애플리케이션 창의 제목을 설정하는 메서드.
  2. 🔗tk.Label(): GUI에서 텍스트 레이블을 생성하는 클래스.
    • .grid(): 레이블의 위치를 설정하는 메서드.
  3. tk.Entry(): GUI에서 텍스트 입력 필드를 생성하는 클래스.
    • .grid(): 입력 필드의 위치를 설정하는 메서드.
  4. tk.Button(): GUI에서 버튼을 생성하는 클래스.
    • .grid(): 버튼의 위치를 설정하는 메서드.
    • .config(): 버튼의 텍스트 또는 기타 속성을 설정하는 메서드.
  5. 🔗window.mainloop(): 애플리케이션의 메인 이벤트 루프를 시작하는 메서드.

 

주요 함수 및 클래스

🔗os 모듈

  • os.path.join()
  • os.listdir()
  • os.path.splitext()

 

🔗shutil 모듈

  • shutil.copy2()

 

🔗tkinter 모듈

  • tk.Tk()
  • tk.Label()
  • tk.Entry()
  • tk.Button()
  • tk.filedialog.askdirectory()

 

위 코드는 파일을 선택하고 복사하는 GUI 애플리케이션을 만드는 데 필요한 주요 Python 함수 및 명령어들을 포함하고 있습니다. 각 함수와 클래스는 특정 작업을 수행하며, 전체 애플리케이션의 기능을 구성하는 데 필수적인 역할을 합니다.