본문 바로가기
Programming/Python

[ 고급 ] 파일명 유틸리티 SR. (v.0.0.2 beta 002) - Updates #3, 4

by The Programmer 2024. 11. 26.

1. Introduction

 

파일명 유틸리티 SR. (v.0.0.2 beta 002) - Updates #3, 4 입니다. ListBox 및 TreeView 위젯을 사용하여 파일 목록을 표시하고 목록을 정렬하는 기능까지만 보여줍니다. 처음에는 ListBox를 이용하고 이후에는 TreeView를 이용해서 단계적으로 개선해 나갑니다. 이 예제를 통해서 ListBox와 TreeView의 활용 가능성을 점검하고 그 한계점도 파악하고자 합니다.

 

2. Code

 

1) ListBox로 파일 목록 구현

더보기

import tkinter as tk
from tkinter import filedialog
import os

def load_files():
    folder_selected = filedialog.askdirectory()
    if folder_selected:
        file_list.delete(0, tk.END)  
# 기존 목록 초기화
        files = os.listdir(folder_selected)
        for file in files:
            file_list.insert(tk.END, file)

root = tk.Tk()
root.title("파일 목록 표시")

frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

file_list = tk.Listbox(frame, width=50, height=20)
file_list.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

scrollbar = tk.Scrollbar(frame, orient="vertical")
scrollbar.config(command=file_list.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
file_list.config(yscrollcommand=scrollbar.set)

load_button = tk.Button(root, text="폴더 선택", command=load_files)
load_button.pack(pady=10)

root.mainloop()

 


2) TreeView로 표시하고 헤더 정보 추가하기.

더보기

import tkinter as tk
from tkinter import ttk, filedialog
import os

def load_files():
    folder_selected = filedialog.askdirectory()
    if folder_selected:
        for item in tree.get_children():
            tree.delete(item)
        
        files = os.listdir(folder_selected)
        for file in files:
            filepath = os.path.join(folder_selected, file)
            size = os.path.getsize(filepath) if os.path.isfile(filepath) else 0
            tree.insert("", tk.END, values=(file, size))

root = tk.Tk()
root.title("파일 목록 표시")

frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

tree = ttk.Treeview(frame, columns=("파일 이름", "크기"), show="headings")
tree.heading("파일 이름", text="파일 이름")
tree.heading("크기", text="크기 (bytes)")

tree.column("파일 이름", width=300)
tree.column("크기", width=100)

tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

scrollbar = ttk.Scrollbar(frame, orient="vertical", command=tree.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
tree.configure(yscrollcommand=scrollbar.set)

load_button = tk.Button(root, text="폴더 선택", command=load_files)
load_button.pack(pady=10)

root.mainloop()

 

 

3) TreeView + 헤더 정보에 기타 정보 추가하기

더보기

import tkinter as tk
from tkinter import ttk, filedialog
import os
import time

def load_files():
    folder_selected = filedialog.askdirectory()
    if folder_selected:
        for item in tree.get_children():
            tree.delete(item)

        files = os.listdir(folder_selected)
        for file in files:
            filepath = os.path.join(folder_selected, file)
            size = os.path.getsize(filepath) if os.path.isfile(filepath) else 0
            modified_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(filepath)))
            file_type = 'Directory' if os.path.isdir(filepath) else 'File'
            tree.insert("", tk.END, values=(file, size, modified_time, file_type))

root = tk.Tk()
root.title("파일 목록 표시")

frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

tree = ttk.Treeview(frame, columns=("파일 이름", "크기 (bytes)", "수정 날짜", "파일 유형"), show="headings")
tree.heading("파일 이름", text="파일 이름")
tree.heading("크기 (bytes)", text="크기 (bytes)")
tree.heading("수정 날짜", text="수정 날짜")
tree.heading("파일 유형", text="파일 유형")

tree.column("파일 이름", width=250)
tree.column("크기 (bytes)", width=100)
tree.column("수정 날짜", width=150)
tree.column("파일 유형", width=100)

tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

scrollbar = ttk.Scrollbar(frame, orient="vertical", command=tree.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
tree.configure(yscrollcommand=scrollbar.set)

load_button = tk.Button(root, text="폴더 선택", command=load_files)
load_button.pack(pady=10)

root.mainloop()

 

 

4) TreeView + 헤더 정보 + 정렬 기능 추가

더보기

import tkinter as tk
from tkinter import ttk, filedialog
import os
import time

def load_files():
    folder_selected = filedialog.askdirectory()
    if folder_selected:
        for item in tree.get_children():
            tree.delete(item)

        files = os.listdir(folder_selected)
        for file in files:
            filepath = os.path.join(folder_selected, file)
            size = os.path.getsize(filepath) if os.path.isfile(filepath) else 0
            modified_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(filepath)))
            file_type = 'Directory' if os.path.isdir(filepath) else 'File'
            tree.insert("", tk.END, values=(file, size, modified_time, file_type))

def sortby(tree, col, descending):
    data = [(tree.set(child, col), child) for child in tree.get_children('')]
    data.sort(reverse=descending)
    for idx, item in enumerate(data):
        tree.move(item[1], '', idx)
    tree.heading(col, command=lambda col=col: sortby(tree, col, int(not descending)))

root = tk.Tk()
root.title("파일 목록 표시")

frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

columns = ("파일 이름", "크기 (bytes)", "수정 날짜", "파일 유형")
tree = ttk.Treeview(frame, columns=columns, show="headings")
for col in columns:
    tree.heading(col, text=col, command=lambda col=col: sortby(tree, col, False))

tree.column("파일 이름", width=250)
tree.column("크기 (bytes)", width=100)
tree.column("수정 날짜", width=150)
tree.column("파일 유형", width=100)

tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

scrollbar = ttk.Scrollbar(frame, orient="vertical", command=tree.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
tree.configure(yscrollcommand=scrollbar.set)

load_button = tk.Button(root, text="폴더 선택", command=load_files)
load_button.pack(pady=10)

root.mainloop()

 

 

5) TreeView + 헤더 정보 + 정렬 기능 + 헤더 컬러 테마 추가

더보기

import tkinter as tk
from tkinter import ttk, filedialog
import os
import time

def load_files():
    folder_selected = filedialog.askdirectory()
    if folder_selected:
        for item in tree.get_children():
            tree.delete(item)

        files = os.listdir(folder_selected)
        for file in files:
            filepath = os.path.join(folder_selected, file)
            size = os.path.getsize(filepath) if os.path.isfile(filepath) else 0
            modified_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(filepath)))
            file_type = 'Directory' if os.path.isdir(filepath) else 'File'
            tree.insert("", tk.END, values=(file, size, modified_time, file_type))

def sortby(tree, col, descending):
    data = [(tree.set(child, col), child) for child in tree.get_children('')]
    data.sort(reverse=descending)
    for idx, item in enumerate(data):
        tree.move(item[1], '', idx)
    tree.heading(col, command=lambda col=col: sortby(tree, col, int(not descending)))

root = tk.Tk()
root.title("SR - File Lister")

style = ttk.Style()
style.theme_use('default')  # 기본 테마 설정
style.configure("Treeview.Heading", 
                background="lightblue", 
                foreground="black", 
                font=("Helvetica", 11, "bold"))

style.map("Treeview.Heading", 
          background=[('active', 'yellow'), ('!active', 'lightblue')])

frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

columns = ("파일 이름", "크기 (bytes)", "수정 날짜", "파일 유형")
tree = ttk.Treeview(frame, columns=columns, show="headings")
for col in columns:
    tree.heading(col, text=col, command=lambda col=col: sortby(tree, col, False))

tree.column("파일 이름", width=250)
tree.column("크기 (bytes)", width=100)
tree.column("수정 날짜", width=150)
tree.column("파일 유형", width=100)

tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

scrollbar = ttk.Scrollbar(frame, orient="vertical", command=tree.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
tree.configure(yscrollcommand=scrollbar.set)

load_button = tk.Button(root, text="폴더 선택", command=load_files)
load_button.pack(pady=10)

root.mainloop()

 

 

3. Result

 

 

[ File Lister using TreeView Ex. 006 Basic v.06 ]

 

 

4. Notes

 

파일 탐색기에서 보여주는 파일 목록 보여주기의 핵심 기능 일부를 구현해봤습니다. 파일 목록 표시를 시작할 시작 폴더는 동적으로 직접 특정 폴더를 선택하도록, 여기서는 표준 대화상자와 버튼을 제시하고 있습니다.  위 코드 내용들은 추후 SR 유틸리티에 통합될 예정입니다.

 

현재로서 style은 ttk 위젯용입니다. ^.^;

 

기본적으로 이 SR 관련 예제들은 저만을 위한 것이어서 사소한(?) 주석은 생략합니다.  코드 시작 부분에서 불러오는 모듈들에 대한 기본적인 사용법은 대략 알고 있어야 합니다. OS 모듈, 파일과 디렉토리 관련 추가 정보들이나 기타 파이썬 표준 라이브러리들에 대해서는 약간의 참고 자료들이 도움이 될 수 있습니다.

 

 

■ 응용 연습 과제

1) ...

2) ...

 

 

5. Files

 

최종판은 맨 아래 파일 Ex_006번 파일입니다. ^.^;

 

File_Lister_Ex_001_.py
0.00MB
File_Lister_using_TreeView_Ex_001_Intro_.py
0.00MB

 

#기타 중간 파일들은 생략. 

 

# 아래. Final File. Ex. 006.

File_Lister_using_TreeView_Ex_006_Basic_v06_.py
0.00MB

 

 

 

6. Ref.

1) Python 공식 사이트 Tkinter 모듈 도움말 / Python IDLE 내장 Tkinter 도움말

 

# 개인적으로 특정 교재들의 후반부는 데이터 과학이나 다른 주제들을 다루고 있는 경우가 많은데, 이보다 표준 라이브러리 중 활용도가 높은 부분을 좀 더 깊이 있게 다루는 것이 좋지 않을까 생각됩니다.  Python 기타 모듈들, 데이터 과학이나 Ai 주제들은 별도의 응용 교재로 분리되어야 한다고 생각합니다. 나름 출판사대로 고민이 있었겠지만.

 

2) 강환수, 신용현 [ 누구나 코딩 ] : 입문서로 매우 좋습니다.

 

3) 천인국, [ Python Express ] : 입문서로 매우 좋습니다.

 

# 이하 4~9)번 참고 교재들은 Python 프로그래머라면 필수로 갖추어 두면 좋을 양서들입니다.

 

4) Mark Lutz, [ Programming Python ] 4th Ed. Tkinter에 대해서도 아주 자세하게 설명합니다. 말 그대로 아주 쉽고 자세합니다. 독서 분량 때문에 힘들다면 힘들다고나 할까.

 

5) Mark Lutz, [ Learning Python ] 5th Ed. 이 한 권의 책! 집에 불이 나서 딱 한 권의 파이썬 책만 가지고 나올 수 있다고 한다면, 단연 이 책입니다. ^.^; 두 권 가지고 나올 수 있다면, 역시 동 저자의 바로 위 교재입니다. ^.^; ㅋ...

 

6) Alan D. Moore, [ Python GUI Programming with Tkinter ] 2nd Ed. Tkinter에 대한 깊이 있는 학습 시간이 될 것입니다. 매우 유용합니다. 최소한 입문서 수준의 OOP 관련 학습은 준비된 후에 보시면 좋겠습니다.

 

7) Doug Hellmann, [ The Python 3 Standard Library by Example ] Python 프로그래머라면 필수라고 여겨집니다. 쉽게 작성된 수 많은 예제들이 매우 돋보입니다.

 

8) David Beazley, [  Python Cookbook ] 3rd Ed. 제법 시간이 많이 지났지만 탁월합니다. 매우 실용적이기도 합니다.

 

9) Martin Fitzpatrick, [ Create GUI Applications with Python & Qt6 (PyQt6 Edition) ] 비교적 최근에 출간된 PyQt 관련 참고도서 중에서는 가장 볼 만합니다. PySide 버전도 있습니다. PyQt6는 Tkinter에 대한 대안 중 가장 유력합니다. wxPython의 최근 교재들은 찾아보기 힘듭니다.

 

 

Happy Programming!

^.^;