본문 바로가기
Programming/Projects

[Python] 화면 녹화 프로그램 1.-opencv, tkinter

by Brian Go 2021. 9. 30.

 

오늘의 도전과제 ! 유튜브를 보면서

'선택한 이미지들을 자동으로 한 사진에서 합쳐서 하나의 이어진 사진들로 만드는 프로그램' 을 만들어봤다.

그런데 이게 가능하면 화면 녹화도 가능이겠는데? 라는 생각이 들었고, 어차피 실전이 필요한 거

만들어보기로 마음먹었다.

 

먼저 구상을 해보자. 화면 녹화 시작, 중지 버튼은 당연히 있어야 하고,

배웠던 거랑 연관지어서 저장경로도 설정할 수 있고 파일 이름도 설정할 수 있게 만들면 좋을 것 같다.

 

일단 인터페이스를 만들어보자. 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도 다 채워주고) 실행시켜보면

 

 

 

확실히 나아졌다!

이제 인터페이스는 이쯤하고, 다음 게시글에서 기능을 구현해보자.

 

 

 

 

댓글