파이썬 실전/동영상 자막 이름 변경 프로그램

파이썬 실전) 자막 이름 변경 프로그램(Subtitles Changer) 2. GUI화

마리사라 2021. 5. 5. 20:06
반응형

이번 글에서는 이전에 만들었던 메커니즘을 이용하여 프로그램을 GUI로 만드는 방법에 대해서 써보겠습니다.


0. 이전 문제의 해답

이전 글에서 여러 파일을 한번에 바꾸는 방법에 대해서 상황을 부여했습니다. 여러 파일을 동시에 바꾸기 위해서는 for문이나 while문등의 반복문으로 파일 이름을 바꾸는 코드를 반복해서 실행하면 되겠습니다. 이때 movies와 subtitles의 인덱스 번호를 반복문의 특성에 맞게 바꿔주셔야 합니다.

 

(1) for문

for i in range(len(movies)):
    os.rename(directory + "/" + subtitles[i], directory + "/" + movies[i][:-4] + subtitles[i][-4:])

(2) while문

count = 0
while count < len(movies):
    os.rename(directory + "/" + subtitles[count], directory + "/" + movies[count][:-4] + subtitles[count][-4:])
    count += 1

1. 코드

우선 GUI로 구현하기 위해서 wxPyhton을 사용하도록 하겠습니다. wxPython에 대해 잘 모르시는 분들은 wxPython에 대해서 써놓은 글들이 있으니 한번 보고 오시는 게 좋습니다.

2021.01.02 - [파이썬 강의/wx] - 파이썬 GUI(wxPython) 0. 설치

 

파이썬 GUI(wxPython) 0. 설치

이번 시간부터 파이썬에서 GUI 프로그래밍을 하는 방법의 일환으로 wxPython을 알려드리도록 하겠습니다. 0. 파이썬 GUI 파이썬에서는 사실 'tkinter'라고 하는 GUI 프로그래밍 모듈을 기본적으로 지원

marisara.tistory.com

 

우선 wxPython와 os 모듈을 import해 줍니다.

import wx
import os

 

이제 wxPython을 위한 기본적인 app을 만들어 줍니다.

class main(wx.Frame):
    def __init__(self, parent, main_id, title):
        wx.Frame.__init__(self, parent, main_id, title, wx.DefaultPosition, size=(650, 720),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.MAXIMIZE_BOX)

class run(wx.App):
    def OnInit(self):
        frame = main(None, -1, 'Subtitles Changer')
        frame.Show(True)
        frame.Centre()
        return True


if __name__ == "__main__":
    app = run(0)
    app.MainLoop()

 

 

이제부터 main의 차례이며, 이번 글에서는 폴더 지정과 파일 불러오기까지 하도록 하겠습니다.

 

먼저 폴더를 여는 기능이 있는 메뉴바와 경로가 저장될 변수를 만들어 줍니다.

menu_bar = wx.MenuBar()
system_bar = wx.Menu()
system_bar.Append(1, '&폴더 열기', '동영상과 자막이 있는 폴더를 엽니다')
menu_bar.Append(system_bar, '&시스템')
self.SetMenuBar(menu_bar)
self.CreateStatusBar()

self.directory = ""

 

 

이후 해당 메뉴를 눌렀을 때 폴더를 여는 창(다이얼로그)가 나타나도록 함수를 만듭니다.

def open_dir(self, event):
    open_dlg = wx.DirDialog(self, "폴더 선택")
    if open_dlg.ShowModal() == wx.ID_OK:
        self.directory = open_dlg.GetPath()

여기서 DirDialog가 폴더를 열때 사용되는 공용 다이얼로그입니다.

DirDialog의 모습

이후 ShowModal을 통해 다이얼로그가 표시되며, 이것이 확인 버튼(폴더 선택 버튼)을 눌렀을 때 if문이 실형 되면서 directory에 폴더의 경로(GetPath)가 저장됩니다.

 

이후 이전 게시글에서와 같이 해당 폴더의 파일들을 불러오고, 그 파일들에서 영상 파일과 자막 파일을 찾아내는 함수를 만들어 줍니다.

def open_dir(self, event):
    open_dlg = wx.DirDialog(self, "폴더 선택")
    if open_dlg.ShowModal() == wx.ID_OK:
        self.directory = open_dlg.GetPath()
        files = os.listdir(self.directory)
        self.search(files)

def search(self, files):
    movies = []
    subtitles = []
    movie_filter = [".avi", ".mkv", ".mp4", ".mpeg"]
    subtitle_filter = [".smi", ".srt", ".ssa", ".ass"]

    for i in movie_filter:
        for j in files:
            if i in j:
                movies.append(j)

    for i in subtitle_filter:
        for j in files:
            if i in j:
                subtitles.append(j)

 

여기까지 하게 되면 GUI에서 영상과 자막이 들어있는 폴더를 지정하고, 해당 폴더 내에서 영상 파일과 자막 파일을 불러올 수 있게 됩니다.

 

이다음은 현재까지 완성된 결과물입니다.

결과물

 


2. 마치며

이번에는 영상 파일과 자막 파일이 들어 있는 폴더를 파이썬 파일이 있는 폴더가 아닌, 원하는 폴더로 지정할 수 있도록 했습니다. 다음 시간에는 파일 이름을 변경할 때, 원하는 이름으로 바꿀 수 있도록 하는 방법에 대해서 써보도록 하겠습니다.

 

또한 이번 시간에도 한 가지 상황을 부여해 보도록 하겠습니다.

(1) 상황부여

현재 상황은 다음과 같습니다.

영상 3개, 자막 3개

대부분의 경우는 이전과 비슷하지만 Movie03과 Subtitle03의 확장자가 대문자(AVI, SMI)로 되어 있습니다. 현재의 프로그램에서는 해당 파일을 읽을 수가 없습니다.

Movie03과 Subtitle03을 읽지 못함

이때 movie_filter와 subtitle_filter를 바꾸지 않고 대문자 확장자를 가진 파일을 불러와야 합니다.


3. 완성 코드

import os
import wx


class main(wx.Frame):
    def __init__(self, parent, main_id, title):
        wx.Frame.__init__(self, parent, main_id, title, wx.DefaultPosition, size=(650, 720),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.MAXIMIZE_BOX)
        menu_bar = wx.MenuBar()
        system_bar = wx.Menu()
        system_bar.Append(1, '&폴더 열기', '동영상과 자막이 있는 폴더를 엽니다')
        menu_bar.Append(system_bar, '&시스템')
        self.SetMenuBar(menu_bar)
        self.CreateStatusBar()

        self.directory = ""

        self.Bind(wx.EVT_MENU, self.open_dir, id=1)

    def open_dir(self, event):
        open_dlg = wx.DirDialog(self, "폴더 선택")
        if open_dlg.ShowModal() == wx.ID_OK:
            self.directory = open_dlg.GetPath()
            files = os.listdir(self.directory)
            self.search(files)

    def search(self, files):
        movies = []
        subtitles = []
        movie_filter = [".avi", ".mkv", ".mp4", ".mpeg"]
        subtitle_filter = [".smi", ".srt", ".ssa", ".ass"]

        for i in movie_filter:
            for j in files:
                if i in j:
                    movies.append(j)

        for i in subtitle_filter:
            for j in files:
                if i in j:
                    subtitles.append(j)


class run(wx.App):
    def OnInit(self):
        frame = main(None, -1, 'Subtitles Changer')
        frame.Show(True)
        frame.Centre()
        return True


if __name__ == "__main__":
    app = run(0)
    app.MainLoop()
반응형