[파이썬3.0]사진 정리 프로그램 만들기 part 2(코드)

카테고리 없음|2014. 7. 12. 13:22

사진 정리 프로그램 만들기

코딩


이제 실제로 코드를 완성해 볼 것이다.


imgtk.py

from tkinter import *

import imgarr

import filedialog

 

def callback1():#경로를 잡기위한 함수1

    name= filedialog.askdirectory(initialdir='.')

    depot.insert(0,str(name))   

 

def callback2():#경로를 잡기위한 함수2

    name= filedialog.askdirectory(initialdir='.')

    depot2.insert(0,str(name))


def arrimg():#정리할 때 필요한 모듈을 사용하는 함수

    imgarr.arrage_img(str(depot.get()+"/"),str(depot2.get()+"/")) 

 

app = Tk()

# width x height + x_offset + y_offset:

app.geometry("470x220+400+300")#윈도우창 크기 설정

app.title('사진정리프로그램with Python(ver.1.0)')#윈도우 창 이름

Label(app, text = "불러올 경로:").place(x=10,y=10,width=90,height=30)

depot = Entry(app)

depot.place(x=110,y=10,width=200,height=30)

Button(app, text='경로 선택(읽어올)', command=callback1).place(x=330,y=10,width=100,height=30)

Label(app, text = "저장할 경로:").place(x=10,y=50,width=90,height=30)

depot2 = Entry(app)

depot2.place(x=110,y=50,width=200,height=30)

Button(app, text='저장할 경로 설정', command=callback2).place(x=330,y=50,width=100,height=30)

Button(app, text='정리 시작', command=arrimg).place(x=70,y=100,width=100,height=30)

Button(app, text='종료', command=app.quit).place(x=180,y=100,width=100,height=30)

Label(app, text = "정리 시작 버튼을 누른 후 활성화 되기 전까지는 작업을 수행 중 입니다.", fg="red",bg="black").place(x=30,y=140,width=400,height=30)

Label(app, text = "만든 사람 : KEI, http://kshyun87.tistory.com", fg="red",bg="black").place(x=30,y=180,width=400,height=30)

app.mainloop()

tkinter를 사용하여 GUI환경을 만들었다.

각종 라벨은 텍스트를 출력해주고, 

엔트리를 이용하여 입력받을 수 있는 창을 만들고

버튼을 이용하여 필요한 기능을 동작시키게 하였다.


Tkinter는 3가지 위치지정방식이 있다.

1.Pack()

2.Place()

3.Grid()

위의 세가지 방식이 있다.


각각의 특징을 간략히 설명하겠다.

1.Pack()

패딩을 이용한 위치 지정이다. 또한 pack(fill=x)와 같은 방식으로 x축전체의 크기로 할당하는 방식도 가능하다.

패딩은 네가지가 존재 한다.

  1. padx
  2. pady
  3. ipadx
  4. ipady

2.Place()

이 방법은 위치를 직접 지정하는 방식이나 html에서도 자주 사용되는 것처럼 윈도우창에서 x,y좌표값을 통해 시작점을 잡고 width와 height를 통해 크기를 설정하는 방식이다. 이것으로 하면 직접 일일히 위치를 지정해야하는 힘든점이 있다.

3.Grid()

pack()의 불편함을 해소하기 위해 등장한 기술.
말그대로 그릴처럼 바둑판식 레이아웃을 사용하는 것이다.
그러나 x,y값이 아닌 행렬을 통해 생성된 테이블을 기점으로 위치를 지정하게 된다.

본 프로그램은 Place()방식으로 위치를 직접 계산하며 지정하였다.


imgarr.py

from PIL import Image

from PIL.ExifTags import TAGS

import os

import shutil

 

def get_imginfo(fname):#사진 정보를 읽어 오는 함수 읽어온( 정보 중 날짜만 추출)

  img = {}

  i = Image.open(fname)

  info = i._getexif()

  if info == None:

    return None

  for tag, value in info.items():

    decoded = TAGS.get(tag, tag)

    img[decoded] = value

   

  return img["DateTime"]

 

def arrage_img(path1,path2):#두 인자를 전달 받고 사진이 있는 폴더에서 사진을 리스트화 시킨다.

    i = 0                              #그리고 나서 for문을 통해 하나 하나 날짜 정보를 추출하여 분류

    images_list = os.listdir(path1)   

    for each_img in images_list:

        imginfo = get_imginfo(path1+each_img)

        imginfo_mem = imginfo[:10].replace(':','-')#날짜가 : 아닌  - 으로 치환

        dic1 = imginfo_mem[:4]

        #생성할 디렉터리 경로와 중복되는 것이 있는지 검사 없으면 해당 경로에 디렉토리 생성.

        if not os.path.exists(path2+dic1+'/'+imginfo_mem):

            os.makedirs(path2+dic1+'/'+imginfo_mem)

            i = 0

            shutil.copyfile(path1+each_img, path2+dic1+'/'+imginfo_mem+'/'+imginfo_mem+' '+str(i)+'.jpg')

        else:

            shutil.copyfile(path1+each_img, path2+dic1+'/'+imginfo_mem+'/'+imginfo_mem+' '+str(i)+'.jpg')

            #shutil.copyfile 복사함.

        i += 1

위 코드에서는 PIL(Python Image Library)를 통해 이미지를 처리하는 것을 볼 수 있다.

그러나 PIL은 2.7버전까지만 지원하고 3.xx버전은 공식적으로 지원하지 않는다.

비공식적인 버전이 있다고는 한다.

PIL보다 더 강력한 기능의 라이브러리가 등장했는데, 그것이 Pillow이다.

3.xx버전까지 지원하며 모든 os를 지원한다고 한다. 

그래서 프로그램을 만들때 파이썬3.3이라서 pillow를 설치했다. 방법은 전에 글을 보면 될 것이다.

코드 설명은 주석처리를 보면 이해가 될 것으로 본다.



댓글()