오늘의 도전과제 ! 유튜브를 보면서
'선택한 이미지들을 자동으로 한 사진에서 합쳐서 하나의 이어진 사진들로 만드는 프로그램' 을 만들어봤다.
그런데 이게 가능하면 화면 녹화도 가능이겠는데? 라는 생각이 들었고, 어차피 실전이 필요한 거
만들어보기로 마음먹었다.
먼저 구상을 해보자. 화면 녹화 시작, 중지 버튼은 당연히 있어야 하고,
배웠던 거랑 연관지어서 저장경로도 설정할 수 있고 파일 이름도 설정할 수 있게 만들면 좋을 것 같다.
일단 인터페이스를 만들어보자. tkinter를 이용하기 위해 from tkinter import *을 해주고,
기본적인 디스플레이 창을 만들어주자. 창 크기 변형은 허용하지 않는 게 깔끔할 것 같다.
(버튼 배치를 좌표로 배치할 게 아니라서 그렇다. 자세한 건 후술!)
이렇게 root변수에 Tk()을 대입한다.
명확하게 알려주는 곳이 없어서 이해에 좀 애먹었는데, Tk()는 인터페이스 창을 만들어주는 역할을 한다.
이걸 하나의 큰 프레임으로 생각하면 된다. 모든 다른 프레임들, 버튼들을 이 큰 틀 안에 차곡차곡 넣어주는 것.
큰 걸 먼저 만들어놓고 한 단계씩 작은 것을 넣어준다고 생각하면 된다.
또 가장 밑의 mainloop 함수도 아주 중요한데,
얘는 루프를 만들어서 화면이 계속 돌아가게 해준다. 이 녀석 아래에 있는 기능들은
화면에 지속적으로 구현이 안되기 때문에, 기능들 제일 아래에 꼭 넣어줘야 한다.
요놈이 보이지 않아도 제일 밑에 있다고 가정하고 봐주시길!
이제 프레임을 만들어보자.
프레임은 녹화 시작-중지버튼 프레임, 저장경로 프레임, 파일명 설정 프레임 총 세가지면 될 것 같다.
이렇게 Frame 모듈을 이용해서 프레임들을 만들었다. 이제 이 안에 버튼이라던지, 텍스트를 입력할 수 있는 공간 등을 넣는 것.
저장경로는 LabelFrame 모듈을 이용해서 제목을 가지는 프레임을 만들어줬다.
(이해가 가지 않는다면 실행컷을 보면 된다.)
그리고 창에 구현될 기능을 설정한 후에는 꼭 pack을 해줘야 하는데,
비유하자면 '그리기' 기능을 수행하는 함수다. 얘로 그려주고, mainloop가 계속 돌아가면서
계속 그려지는 느낌!
지금은 따로 창의 크기를 설정해둔 게 없어서 실행을 시켜도 프레임뿐이라 창은 뜨지만, 내용도 없고
잘 보이지도 않는다.
그렇다면 Button 모듈을 이용해서 버튼들을 넣고 한 번 실행시켜보자.
이렇게 녹화 시작, 중지 버튼과 저장 경로 찾아보기 버튼을 넣어주었다.
버튼을 설정할 때 첫 번째 변수는 버튼을 넣을 프레임을 넣어주면 된다. text=는 버튼에 표기될 텍스트를 뜻한다.
정의해주고 pack까지 해주고 실행시켜보면
아직 어설프지만 요런 창이 등장한다!
저장 경로는 레이블프레임으로 정의했으므로 제목을 가지는 것을 볼 수 있다.
다만 파일명 프레임은 아직 아무런 기능도 구현하지 않아서 보이지도 않는 것을 알 수 있다.
그렇다면 파일명 프레임에 기능을 넣어보자. 이번에 사용할 모듈은 Entry와 Label을 넣어보겠다.
이렇게 넣어줬다. Label 모듈은 기능 없는 텍스트를 화면에 구현해주고, Entry는 한 줄짜리 텍스트 입력칸을 만들어준다. 한 번 실행시켜 보자.
근데 버튼들의 배치나 프레임의 크기가 마음에 들지 않는다.
크기랑 위치를 좀 정해보자. 여기서 이용할 것은 pack()이다.
pack() 모듈 안에는 요소의 크기나 배치를 설정할 수 있는 기능들이 있다.
그 중에서 padx, pady, side=, fill= 기능들을 이용해보자.
padx, pady는 각각 가로, 세로 여백을 책임진다. '안에 있는 요소'와의 거리를 설정하므로,
프레임이면 버튼과의 여백, 버튼이면 버튼의 텍스트와의 여백을 설정하는 것.
side=는 인터페이스 창 안에서 요소의 배치를 설정한다. left, right를 통해 설정할 수 있고,
fill=을 이용하면 가로나 세로, 혹은 둘 다를 설정하여 그 요소로 공백을 채운다.
백문에 불여일견, 한 번 해보자.
이렇게 프레임에는 padx, pady와 fill을 써줬고 시작 버튼에는 side='left', 중지 버튼에는 side='right'을 넣어줬고
저장 경로도 좌우로 나눠주고, 파일명 입력창도 좌우로 나누어줬다. 버튼에도 모두 padx pady를 넣어줬다.
(qbtn_frame에 안 넣은 것은.. 실수입니다..ㅎㅎ)
실행시켜 보면
많이 나아졌다! 그러나 버튼이 너무 작아서 조금 답답한 감이 있고,
찾아보기 옆에 엔트리를 하나 넣어서 설정한 주소를 넣어줄 수 있었으면 좋겠다.
버튼의 절대적 크기는 버튼의 정의에서 width를 통해서 만들 수 있다.
또 시작 - 중지 버튼 사이에 간격을 더 넣어주기 위해 expand 값을 True로 설정해주자.
expand는 미사용 공간을 확보해주므로 버튼들을 쭉 떨어뜨려 놓을 수 있다.
엔트리는 아까처럼 저장경로 프레임에 넣고, side=를 이용해서 버튼은 왼쪽으로 보내고 엔트리는 오른쪽으로 정렬해주면 되겠다.
(깜빡한 btn_entry도 다 채워주고) 실행시켜보면
확실히 나아졌다!
이제 인터페이스는 이쯤하고, 다음 게시글에서 기능을 구현해보자.
'Programming > Projects' 카테고리의 다른 글
[Javascript] 자바스크립트로 아이스하키 경기 슈팅 기록 사이트 만들기 (0) | 2022.06.07 |
---|---|
[Python] 화면 녹화 프로그램 2.-opencv, tkinter (0) | 2021.09.30 |
[Python] 계산기 만들기 - tkinter (0) | 2021.09.30 |
[Python] 인스타그램 좋아요 매크로 업그레이드- opencv (0) | 2021.09.30 |
[Python] 인스타그램 좋아요 매크로-selenium (1) | 2021.09.30 |
댓글