본문 바로가기

바탕화면 애완묘 만들기 작업-1 본문

A/Software

바탕화면 애완묘 만들기 작업-1

생름 2023. 4. 28. 23:43

요사이 자바보다 비교적 사람에게 관대한 언어(라고 알려진) 파이썬을 공부중이다. 물론^^ 자바를 안다고 하기에 빈약한 실력이지만 자바 베이스로 만든 언어인 프로세싱은 다뤄본 적이 있다. 파이썬에서도 클래스와 모듈 구조는 동일하게 응용할 수 있을 것 같아 근자감은 충만한 상태다. 프로세싱과 다르게 시각적으로 바로 결과 표현이 안되어 개인적으로 난이도가 높다.


파이썬으로 작업하기


1. 바탕화면에 띄워놓을 수 있는 실행파일을 만들어본다. 웹 버전의 실행파일은 돌아가는 방식을 조금 이해했으니, 운영체제 위에 작동되는  프로세스를 만들어보면 좋겠다. tkinter 모듈을 사용하면 윈도우창을 만들 수 있단다.  
 
2. 정확히는 고양이 친구를 만들거다. 예전에 친구에게 바탕화면용 크리스마스 트리 멀티팩을 받고 행복해진 적이 있다. 같은 원리로 내 흐물거리는 고양이를 만들 수 있을것 같다. 귀엽겠지? 데스크탑에 돌아다니도록 만들어볼거다.

바탕화면용 트리

나의 흐물흐물한 고양이는 어떻게 생겼냐면.. 이렇게 생겼다. 늠름하지 않은가. 2년전 해남으로 내려간 우리집 고양이 비비안을 추억하며 끄적인 낙서다.

흐물흐물 고양이

마음에 들어서 터프팅 작업 때도 가져다 썼다. 터프팅 클래스 선생님과 몇몇 분들이 이해하지 못하는 도안인데다, 원본의 총명함이 다소 사라져 속상했지만 지금도 내방 한켠에 존재감을 지키며 잘 있다.  

심바모티프의 흐물흐물 고양이

 
3. 백지 같은 내 머리가 따라갈 이정표를 발견했다. 찾아보니 어느 선생님께서 고양이 애호가임에도 알레르기 때문에 키울 수 없어서.. 랜선 고양이를 만들고 스크립트를 배포한단다. (더노바디 선생님네 고양이는 우아하게 생겼다.)
여태까지 컴퓨터에서 내가 궁금해하는 내용은 대게 질문과 그에대한 적절한 답을 꼭 발견할 수 있었다. 보통 궁금한 부분을 잘개 쪼개서 찾아야 나오는 편인데, 이번엔 통짜로 구했다..! 이분의 답안이 챗지피티 답안보다도 나은 것 같다. 덕분에 삽질을 덜해서 좋지만, 그만큼 뒤쳐진 기분도 든다. 나는 이 스크립트를 그대로 사용했고, 일부 수정하거나 이해가 안되는 부분은 하단에 기록하였다.

선생님이 만든 작업물은 쉽게 잘 작동했다. 고양이가 윈도우 창을 끌고 걸어다니기까지 한다. 아래 window.geometry의 크기와 위치를 결정할 때 x값 표현 참고. 고양이 이동을 자유롭게 풀어두고 범위를 걸면 좋을 것 같다. 

window.geometry('200x110+' + str(x) + '+300')  #window.geometry('widthxheight+positionX+positionY

 
4. 더 추가하고 싶은 것. 
마우스로 드래그하여 고양이를 원하는 곳으로 움직일 수 있으면 좋을 것 같다. 보통은 창의 탭을 이동할 수 있는데, (탭은 윈도우에서 어떤 방식으로 이동할까?) 이 실행파일은 window.overrideredirect 값으로 탭을 보이지 않도록 설정하면 클릭이 어렵다. 같은 이유로 콘솔 창 없이 실행파일 작동을 중지하는 것이 어렵다. 키보드/마우스 제어는 pyautogui를 사용하면 된다는 팁을 발견해 다음단계에서 테스트해볼 예정임.

화면에서 실행파일 창이 움직일 때 가로세로 제한을 두고 일정 범위를 지나면 돌아가도록 해야한다. 물론 더노바디선생님이 작업한대로  random.randrange의 순서를 정해 같은 확률로 양 옆으로 오게할 수도 있지만, 우리 흐물흐물고양이는 내가 허락하는 범위에서 자유롭게 돌아다니면 좋겠다. (예시: 오른쪽으로 0.1초동안 이동하면 왼쪽으로 0.1초 이동한다.) 


작업물 결과 


용례1 gif
용례2 gif, 친절한 이소장님께서 만들어주신 배경화면


 
 

흐물고양.zip
13.39MB

 
위 링크를 다운받아 압축을 푼 뒤, 실행하면 왼쪽으로 조금씩 이동하는 고양이가 나온다. 화면에서 무궁화 꽃이 피었습니다를 하고있는 것 같다. 나는 아직 화면 가로/세로 제한을 거는 방법을 모르기 때문에, 스크린 창을 넘어가면 고양이는 돌아오지 않는다. 백그라운드에서 메모리만 잡아먹으니깐 잊지말고 작동을 중단해야한다. 

컨솔(네모상자)를 임시적으로 나타나도록 설정했는데, 컨솔이 없을 경우 무식한 방법으로 작업을 끝내야하기 때문이었다. 작업관리자(ctl+alt+del)을 실행 후 백그라운드 프로세스에서 fluffycat.exe를 찾은 뒤 작업을 따로 끝내야한다.
 

수작업으로 만든 흐물스gif

 
임포트한 함수:

tkinter: 그래픽 사용자 인터페이스용 모듈로 에러를 시각적으로 확인할 수 있어 반복문이나 함수를 익히는데 유용하다.

pyautogui: 이 라이브러리는 마우스 자동화가 가능하다고 한다. 조만간 아이콘을 마우스로 이동할 수 있게 될거다.
 
실행파일 만들기:

다른 컴퓨터에서도 작동하도록 실행파일을 만들 수 있다. pyinstaller을 cmd에서 실행시키면 간편하게 작업이 가능하고 메뉴얼도 잘 나와있다. 

그럼에도 불구하고 몇가지 난관이 있었는데, 첫번째는 pyinstaller을 할 .py 파일 위치를 찾지 못하는 것. python.exe 파일은 [C:\Users\AppData\Local\Programs\Python\Python311] 에 있어서 그런지, cmd의 지정 패스 [C:\Users\DELL G5]에서  pyinstaller 실행파일 패키지 위치를 찾지 못했다. 그러던 중 path 시스템 변수를 편집하면, 어느 경로에서나 파이썬 부속파일(pip, pyinstaller..)을 실행할 수 있단다. 시스템 속성 (실행창 sysdm.cpl 입력) - 고급 -  path에 [C:\Users\AppData\Local\Programs\Python\Python311\Scripts] 를 추가하였더니 부속파일 위치를 잘 인식한다. (출처: 뇌를 자극하는 파이썬 3)


실행파일을 원파일로 만들거나(--onefile 또는 -F) 콘솔창을 없애려면(--noconsole) cmd에서 pyinstaller을 실행할 때 명령어를 추가하면 된다.

실행파일 작업시 upx 파일 설치가 따로 필요하다고 나온다. 실행에 별 무리 없어서 없이 진행하였다.

 
두번째 난관은 pyinstaller의 압축된 실행파일로 만들어주는 onefile을 옵션선택하더라도 이미지파일은 따로 임베드해야했던 점이다. onefile로 작업하더라도 외부파일은 포함되지 않기 때문이다. 임베드 방식은 다음 두가지 방식으로 나뉜다고 생각했다.
(가정1) 이미지 폴더를 실행파일 외부에 따로 지정하도록 한다.
(가정2) onefile로 실행파일 내부에 포함되도록 한다.
어쩌면 --add-data를 통해 단일 외부파일을 가정2의 실행파일에 포함시킬 수도 있을 것 같긴한데, 나는 포함시킬 gif 파일이 여러 개라 다른 방법을 써야한다. 

그래서 spec file을 알게되었다. .spec 파일은 다양한 옵션을 쉽게 추가할 수 있는 재래식 gui같다. .spec을 통해 gif 파일을 임베드 시키기로 했다. pyinstaller에도 설명이 자세히 나와있지만, 나는 coderslegacy 사이트를 참고하였다. 이 방법으로도 위의 가정2 판타지가 가능할 것 같았으나, 아주 즐거운 마음으로 다섯번정도 다른 컴퓨터로 가져가 시도해보고 실패한 뒤 가정1이 맞다고 결론 내렸다.

가정1을 실현하기 위해 가장 먼저 이미지 폴더를 상대경로로 지정해야했다.

.py 파일의 path에서 gif 폴더 위치 상대경로로 지정하고 .spec 파일을 생성하고 내부의 datas에서 상대경로를 지정/수정해준 뒤, 실행파일에 같이 압축해서 업로드하기로 했다. 그림설명은 아래에 있다. 

(1) .py 파일의 path에서 gif 폴더 위치 상대경로로 지정

 
cmd 창에서 [pyinstaller --onefile fluffycat.py]를 아래와 같이 실행하면, fluffycat.py 파일 위치에 .spec 파일이 생성된다. 

fluffycat.spec을 생성한다.

 
생성된 .spec 파일을 열고 datas에 이미지 상대 디렉토리를 아래와 같이 입력한다. 

(2) .spec 파일의 datas에서 상대경로 지정

 
cmd 창에서 [pyinstaller fluffycat.spec]를 아래와 같이 실행하고, '외부폴더 위치 데이터'가 포함된 fluffycat.exe를 생성한다. (상대경로일 때는 이 단계를 생략해도 될 것 같은데 아직 테스트해보지 않았다..)

경로가 포함된 fluffycat.exe를 생성한다.

 
실행파일 압축시 이미지폴더 lib을 같이 포함시킨다. 

(3) 실행파일에 같이 압축해서 업로드

 


알게된 정보 


1. window.after(ms, function, argument1, argument2, ... )
ms: 지연시간, funcion: 시작할 함수, *args(optional): 함수 호출때 사용되는 인수

window.after(400,update,cycle,check,event_number,x)

window.after는 재귀형 루프를 돌릴 때 사용된다. 재귀(recursive)란 반복(iteration)과 구분되는 용어로, f(n) = f(n-1)+f(n-2)과 같은 식처럼 함수 안에 자신을 호출하는 경우를 의미한다. 위에서는 400ms, 0.4초 후 함수 update가 사용되며, cycle, check, event_number, x 등은 해당함수에 사용되는 인수(arguments)이다.  
 
2. random.range(startstop[step]) 출처

event_number = random.randrange(1,3,1)  #random integer 1,2

 
3. window.overrideredirect(True) 
Tk 레퍼런스, 출처 창 탭이 사라진 상태. 괄호 안 값이 0이 아닌 경우, 윈도우창의 관리자가 제목/탭을 꾸미지 못하게 설정. 또한 윈도우 창이 기존의 방식대로 움직이거나 닫히지 못한다. 
 
4. [Tkinter PhotoImage(file=photo_path, format = f'gif - index {i}') for i in range(frames)]

sleep = [tk.PhotoImage(file=impath+'\\sleep.gif',format = 'gif -index %i' %(i)) for i in range(2)] #sleep gif

Tkinter PhotoImage는 Tkinter에서 이미지를 보여주는 모듈이다. 파일위치와, 필요하다면 보여주는 형식도 지정한다.
'%' 기호 뒤에는 자료형을 가리키는 문자를 많이 쓴다. 이상하게 생겼지만 다음과 같은 식으로 쓰면됨.

위 format에서  'gif-index%i' %(i) 는 따라서  for i in range(2) 동안  gif-index1, gif-index2를 의미하고, 지정된 시간동안 각 frame을 호출하는 것을 의미한다. f'gif-index{i}'와 'gif-index%i'%i가 표현방식이 다른지 아직 잘 모르겠다. 결과물은 똑같음.
 
5. 파이썬은 대괄호가 없는 대신 들여쓰기 위치가 중요하다. 함수 선언 후 꼼꼼히 챙기지 않으면 에러가 난다..
 
6. 패키지(파이썬 부속파일)/라이브러리/모듈 구분이 어렵다. 정리 필요함.

'A > Software' 카테고리의 다른 글

211003_AI_generate  (0) 2021.10.03
Comments