2 minute read

1. 뜬금없이 python 으로 GUI 구현

회계사인 친구에게 프로그램을 만들어달라는 부탁을 받았다. 40여명의 신입 회계사들이 쓸 거라고 했다. 그들의 쓸데없는 노가다를 줄여주고 야근을 없애줄 프로그램을 만들어달라고 했다. 친구야 알겠지만 나는 컴공 출신이 아니라 통계학과 출신이야… 라는 말이 목구멍에서 맴돌았다.

돈을 받았다.

사명감이 생겼다.

그리고 사실은 쉬울 거라고 생각했다. 그리고 실제로 프로그램의 알고리즘을 짜는 것 자체는 어렵지 않았다. 특정 경로에 모여있는 pdf 파일들에

  1. 사용자가 원하는 글자
  2. pdf 제목 일부
  3. 페이지 번호

…로 이루어진 텍스트를 페이지마다 추가한 뒤 따로 저장하기만 하면 된다. 하지만 문제는 이를 쓰는 사람들은 나보다도 컴알못이라는 점이 문제였다. 친구에게 대뜸 .py 파일을 실행시켜보라고 했더니 (타겟 경로를 argparse 로 인풋하는 파일이었다…) 친구는 동공을 마구 흔들며 동기들은 이거 절대 못 쓸 것 같다고 작은 목소리로 중얼거렸다. 나는 내 잔고에 들어왔던 얼마의 돈을 생각했다. 그럼 이거, 내가 실행파일로 바꿔올게. 조금만 기다려 친구야.

2. Pyinstaller

…이라는 패키지가 있다. 파이썬으로 짜여진 코드를 .exe 실행파일로 변환해주는 패키지이다. 그냥 이거 깔고, 실행시킬 파이썬 파일을 다음과 같이 터미널에서 변환시킬 수 있다.

pyinstaller run.py --onefile

--onefile argument 를 추가시키고 돌리면, py 파일이 있는 경로에 dist 폴더 안에 exe 실행파일이 하나 생긴다. 이거만 있으면 파이썬이고 뭐고 하나도 없는 컴퓨터에서 파이썬으로 짰던 프로그램이 돌아간다!

단 주의사항이 있는데, 맥에서 pyinstaller 로 만든 실행파일은 window 에서 실행할 수 없고 vice versa라고 한다. 그리고 하필 나는 맥을 쓰고있고, 친구는 윈도우를 쓴다… 학부 시절 SAS 때문에 패러랠스 설치해뒀던 게 이렇게 쓰일 줄이야. 인생사 새옹지마다. 사용자가 누구인지에 따라 알맞은 os에서 만들어주도록 한다.

3. Tkinter

이 패키지는 파이썬 내장 패키지라 별도의 install 이 필요하지 않다. 이 패키지로 각종 GUI 를 구현할 수 있다고 한다. 사실 아직도 사용방법을 완벽하게 숙지하진 못했다…내가 지금까지 넣은 기능은 딱 두개다.

3.1. filedialog

사용 방법이 개중에 가장 쉬웠다. 파일 속에 아래처럼 코드를 써 두고

from tkinter import filedialog
path = filedialog.askdirectory()

파일을 실행하면 아래와 같은 창이 뜬다.

askdir

사용자가 이 창에서 경로를 선택하고 나면, path 변수에 이 경로가 string으로 저장된다! 이렇게 얻은 경로를 사용해서 함수에 넣기만 하면 된다.

3.2. Entry

그냥 콘솔에서 실행시키는 프로그램이라면 input 으로 입력값을 받으면 된다. 하지만 내가 하고 싶은 건 창을 띄워서 그 창에 값을 입력시킨 후 그 값을 받는 것이었다. Tkinter 의 Entry 가 그 역할을 한다. 문제는, 생각보다 입력값을 받아 이용하는 그 과정이 컴알못인 나에게는 쉽지 않았다는 것이다. 우선 tkinter 를 모두 임포트시킨다.

from tkinter import *

그리고 아래 코드를 실행시키면 빈 창이 생성된다.

root = Tk()

tkroot

위에 tk 라고 써있는 게 맘에 안드니 바꾸도록 하자.

root.title("NU LAUNCHER")

nulauncher

이건 입력창이니까, 뭔가를 입력하라고 설명을 써 주는게 좋다.

label = Label(root,text='뭐라고 말 좀 해봐!')
label.pack()

pack 은 내용물에 맞게 창 크기를 줄여주는 역할을 한다. 그래서 이렇게나 창이 조그매져버렸다.

saysth

이제 이 아래에 사용자가 입력할 수 있는 창을 만들어주자. 마찬가지로 pack 을 해주도록 한다.

entry = Entry(root)
entry.pack()

wentry

설명 아래의 입력창에 아래처럼 무언가를 쓸 수 있게 되었다.

wentrywords

음.. 근데 사용자가 여기에 입력을 다 하고 나면, 어떻게 입력값을 받지? 버튼을 누르는 순간 값이 나에게 들어오도록 하면 좋겠다. 버튼을 만들어주도록 하자.

button = Button(root,text='확인',command=print(f'{entry.get()} 라고 말한 사람 나와.'))
button.pack()

wbutton

이렇게 하면, 뭔가를 쓰고 확인 버튼을 누르면 무슨 말을 했든간에 불려나가야하는 프로그램이 만들어진다. 버튼 만들기 전에 인풋을 entry.get() 으로 받으면 안될까 싶은 생각이 들지만 조금만 생각해보면 안된다는 사실을 깨달을 수 있을 것이다. 버튼을 누르기 전에 지멋대로 get 해버리면 아무것도 받아지지 않을 것이기 때문이다.

Button 의 저 command kwarg 가 나에게는 쓰기 쉽지 않았는데, 버튼을 누르는 순간 실행 되었으면 하는 함수를 하나 만들고나서 lambda 로 넣어주면 되더라. 예를 들어,

def some_function(text) :
    do_something(text)

이런 함수가 있다고 치자. 이 함수에 사용자가 입력한 값을 넣어서 함수를 실행시키고자한다면

button = Button(root,text='확인',command=lambda: some_function(entry.get())'))

이렇게 하면 되겠다. 버튼을 누르는 순간 entry.get() 이 실행되면서 some_function 으로 들어가게 된다. 아직 Tkinter 에 익숙치 않아서 구현하고 싶은 기능을 다 넣지 못했는데, 다음 주에는 progress bar 이랑 완료되었다는 창도 띄울 수 있으면 좋겠다.

Leave a comment