이제 지난시간에 만들어 놓은 뼈대 frame에 파일을 추가, 삭제 하는 함수를 만들어 작동시켜 보자.

함수 작성에 앞서 tkinter에서 filedialog 라는 서브 모듈을 불러와야 한다.
서브 모듈들의 경우 __all__로 정의되지 않았기 때문에 이렇게 따로 불러와야 사용이 가능하다.

add_file()이라는 새로움 파일 추가 함수를 만들었다.
해당 기능은 filedialog 모듈을 통해서 사용 가능하며, title=""은 창의 제목, filetypes=""는 해당 선택될 파일의 확장자명을, initialdir=""은 해당 창이 시작될 위치 (위 코드에서는 c:/가 된다) 를 지정해 줄 수 있다.

해당 파일이 잘 선택 되어 지는지, 콘솔창을 통해 확인해보자.

이제 이렇게 files에 저장된 파일 정보를 리스트 프레임에 보여주면 된다.

for문을 이용해서 넣는 이유는 리스트박스에 한줄에 하나의 파일을 보여주기 위해서다. 만약, for문을 사용하지 않고 해당 files 를 바로 list_file.insert()로 삽입하면, 한줄에 3개의 파일명이 출력된다.

처음 파일 선택시 보여줄 폴더를 지정할때에는 r"경로"로 사용하면, 탈출문자에 상관없이 경로를 그대로 사용하게 된다.
이제 "선택삭제"를 위한 함수를 만들어 보자.
삭제는 한가지 주의할 점이 있는데, 이게 생각보다 까다롭다.

위와 같이 프로그램에서 첫번째와 3번째 파일을 삭제한다고 가정해 보자.
먼저 해당 파일들은 순서에 따라 index를 가지게 되는데, 이 index가 절대값이 아닌 상대값이다.
즉 첫번째(index 0) 파일이 삭제된 다음에는, 그 다음 파일이 다시 첫번째(index 0)이 되는 것이다.
따라서, 이러한 경우에는 보통 뒤에서부터 index값을 계산해서 삭제해 나가는게 편하다.
간단한 예제를 통해 살펴보자.

일반적인 .reverse()를 해버리면, 해당 리스트의 순서가 완전히 뒤바뀌게 된다. 이는 "선택삭제"에 올바른 기능을 제공할 수 없다.

따라서 reversed()를 통해 대상 리스트에 영향을 주지 않으며, 전달하는 값들의 순서만 역순으로 해 줄 필요가 있다.
이제 코드로 돌아와서, "선택삭제"를 위한 함수를 작성해 주자.

이제 list_file의 요소들을 역순으로 index라는 새로운 리스트에 저장하게 된다.

각 index값 0, 3, 5 세가지를 삭제해보자.
del_file()함수에 의해 index 5부터 삭제해 가기 시작한다.
index 5가 삭제된 이후에도 index 3의 위치 변화는 없으므로, 바로 index 3이 삭제된다.
이제 불필요한 파일도 삭제했겠다, 저장경로를 설정해 주자.

browse_dest_path라는 함수를 먼저 만들어주고, "찾아보기" 버튼에 해당 함수를 매치 시켜 주자.

이제 해당 함수를 완성해보자.
먼저 filedialog.askdirectory()로 사용자에게 저장할 폴더를 지정할 창을 보여준다
여기서 만약 사용자가 추소를 누른다면(==""), 해당 함수는 바로 빈 값을 forlder_selected에 반환해 준다.
이 전달받을 값을 txt_dest_path (저장 경로의 빈 Entry)에 보여주기 위해, delete(0, END)로 해당 Entry의 내용을 다 삭제한 뒤, insert를 통해 삽입하면 된다.
이제 제일 아래로 넘어와서 "시작" 버튼의 기능을 만들어 주자.
해당 함수를 정의하기 앞서, "옵션"에서 선택한 내용이 잘 전달 되는지 확인해야 한다.

또한 선택된 파일이 없을때에는 해당 프로그램을 시작할 수 없기에, tkinter.messagebox 를 불러와 경고창도 하나 추가해주자.

.size()를 통해 해당 list_file의 요소가 아무것도 없다면, 저렇게 경고창이 띄워지게 된다.

또한 저장 경로가 없을때에도 프로그램이 실행될 수 없기에, if문을 활용해 경고창을 보여주도록 하자.
여기서 한가지 의문점이 생겼는데, 왜 list_file 은 size()로 값을 비교하고, txt_dest_path는 len 으로 비교하는지 의문이 생겼다. type 으로 두 변수의 class를 확인해 봤지만, 각 tkinder.Listbox와 tkinder.Entry 라는 차이만 알 수 있었다.
지금 당장은 무슨 차이때문에 저렇게 다르게 사용하는지는 알 수 없었다.
'개인공부 > python' 카테고리의 다른 글
| 나 혼자 하는 프로젝트 2탄 - GUI 프로그래밍(12) - 이미지 합치는 프로그램 만들기(4) (0) | 2022.10.19 |
|---|---|
| 나 혼자 하는 프로젝트 2탄 - GUI 프로그래밍(11) - 이미지 합치는 프로그램 만들기(3) (0) | 2022.10.18 |
| 나 혼자 하는 프로젝트 2탄 - GUI 프로그래밍(9) - 이미지 합치는 프로그램 만들기(1) (0) | 2022.10.17 |
| 나 혼자 하는 프로젝트 2탄 - GUI 프로그래밍(8) - 메모장 만들기 (0) | 2022.10.17 |
| 나 혼자 하는 프로젝트 2탄 - GUI 프로그래밍(7) - 그리드(Grid) (0) | 2022.10.15 |