파이썬 tkinter GUI 입문 - 나만의 미니 프로그램 만들기! 글자 수 세기 앱 🖥️
목차10개 항목
안녕하세요! Mojangcam입니다 😎
지금까지 우리가 만든 파이썬 프로그램은 전부 까만 콘솔 창에서 돌아갔어요. 그런데 문득 이런 생각 안 드셨나요? "내가 만든 프로그램도 버튼 달린 진짜 프로그램처럼 생겼으면 좋겠다!" 오늘은 그 소원을 이뤄볼 거예요. 파이썬에 기본으로 들어있는 tkinter(티케이인터)로 창을 띄우고, 버튼을 달고, 실제로 쓸모 있는 글자 수 세기 미니 프로그램을 완성해볼게요.
블로그 글자 수 확인할 때, 자기소개서 글자 수 맞출 때마다 매번 웹사이트 검색하셨죠? 오늘 이후로는 내가 만든 프로그램으로 해결됩니다!

📌 준비물
- Python 3.8 이상 (이 글은 최신 안정 버전 기준으로 작성했어요)
- tkinter — 파이썬 표준 라이브러리라서 별도 설치가 필요 없어요! (pip install 불필요)
- 윈도우에서 파이썬 설치 시 기본 포함돼요. 설치돼 있는지 확인하려면 터미널에 아래 명령을 입력해보세요.
python -m tkinter작은 테스트 창이 뜨면서 Tcl/Tk 버전(공식 배포판 기준 8.6)이 보이면 준비 끝이에요. 창이 안 뜨면 아래 "자주 나는 에러" 1번을 확인해주세요!
🧠 tkinter가 뭐예요?
tkinter는 파이썬에서 GUI(그래픽 사용자 인터페이스)를 만드는 표준 라이브러리예요. 창(Window), 버튼(Button), 입력창(Entry) 같은 걸 파이썬 코드 몇 줄로 만들 수 있어요. PyQt나 Kivy 같은 외부 라이브러리도 있지만, 설치 없이 바로 시작할 수 있고 자료가 많아서 GUI 입문은 tkinter가 정석입니다.
📌 1단계 - 빈 창 띄우기
GUI 프로그램의 "Hello World"는 빈 창 띄우기예요. 딱 5줄이면 됩니다.
import tkinter as tk
root = tk.Tk() # 창 만들기
root.title("글자 수 세기 미니 프로그램") # 창 제목
root.geometry("420x320") # 창 크기 (가로x세로)
root.mainloop() # 창 실행 (필수!)하나씩 뜯어볼게요 💡
- tk.Tk() : 프로그램의 메인 창을 만들어요. 모든 tkinter 프로그램의 시작점이에요.
- geometry("420x320") : 창 크기를 픽셀로 정해요. 가운데 글자는 숫자 1이 아니라 영문 소문자 x예요!
- mainloop() : 창을 계속 띄워두고 클릭·입력을 기다리는 이벤트 루프예요. 이게 없으면 창이 뜨자마자 꺼져요.

📌 2단계 - 위젯 배치하기 (Label, Text, Button)
창 위에 올라가는 부품들을 위젯(Widget)이라고 불러요. 안내 문구(Label), 글 입력창(Text), 버튼(Button)을 올려볼게요.
title_label = tk.Label(root, text="글자 수 세기", font=("맑은 고딕", 14, "bold"))
title_label.pack(pady=10)
text_box = tk.Text(root, height=8, width=45, font=("맑은 고딕", 10))
text_box.pack(padx=10)
result_label = tk.Label(root, text="공백 포함 0자 / 공백 제외 0자", font=("맑은 고딕", 11))
result_label.pack(pady=10)
copy_button = tk.Button(root, text="입력한 글 복사하기", width=20)
copy_button.pack()하나씩 뜯어볼게요 💡
- Label : 글자를 보여주는 위젯. 결과 표시에도 쓸 거예요.
- Text : 여러 줄 입력창이에요. 한 줄짜리 입력만 필요하면 Entry를 써요.
- pack() : 위젯을 창에 위에서 아래로 차곡차곡 배치하는 방법이에요. pady·padx는 위아래·좌우 여백이에요. (좌표로 자유 배치하는 place, 표처럼 배치하는 grid도 있는데 입문은 pack이 제일 쉬워요!)
📌 3단계 - 기능 연결하기 (이벤트)
이제 핵심이에요. "키보드를 누를 때마다" 글자 수를 세고, "버튼을 누르면" 클립보드에 복사되게 만들어볼게요.
from tkinter import messagebox
def count_text(event=None):
text = text_box.get("1.0", tk.END).rstrip("\n")
with_space = len(text)
without_space = len(text.replace(" ", "").replace("\n", ""))
result_label.config(text=f"공백 포함 {with_space}자 / 공백 제외 {without_space}자")
def copy_result():
text = text_box.get("1.0", tk.END).rstrip("\n")
if not text:
messagebox.showwarning("알림", "글자를 먼저 입력해주세요!")
return
root.clipboard_clear()
root.clipboard_append(text)
messagebox.showinfo("복사 완료", "입력한 글이 클립보드에 복사됐어요!")
text_box.bind("<KeyRelease>", count_text) # 키를 뗄 때마다 실행
copy_button.config(command=copy_result) # 버튼 클릭 시 실행하나씩 뜯어볼게요 💡
- get("1.0", tk.END) : Text 위젯의 내용을 처음부터 끝까지 가져와요. "1.0"은 1번째 줄, 0번째 글자라는 뜻이에요. 끝에 자동으로 붙는 줄바꿈 하나는 rstrip으로 떼줘요.
bind("<KeyRelease>", 함수): "키보드에서 손을 뗄 때"라는 이벤트에 함수를 묶어요. 덕분에 타이핑하는 즉시 글자 수가 실시간으로 바뀌어요!- command=함수 : 버튼 클릭 시 실행할 함수를 지정해요. 이때 copy_result()처럼 괄호를 붙이면 안 돼요! 괄호를 붙이면 그 자리에서 바로 실행돼버려요.
- clipboard_append() : 클립보드에 글자를 넣어요. Ctrl+V로 어디든 붙여넣을 수 있게 돼요.
- messagebox : 알림 팝업창이에요. showinfo(정보), showwarning(경고), showerror(에러) 세 종류를 기억해두세요.
📌 전체 코드 (복붙 OK)
# Python 3.8+ / tkinter (표준 라이브러리 - 설치 불필요)
import tkinter as tk
from tkinter import messagebox
def count_text(event=None):
"""입력창의 글자 수를 세서 라벨에 표시"""
text = text_box.get("1.0", tk.END).rstrip("\n")
with_space = len(text)
without_space = len(text.replace(" ", "").replace("\n", ""))
result_label.config(text=f"공백 포함 {with_space}자 / 공백 제외 {without_space}자")
def copy_result():
"""입력한 글을 클립보드에 복사"""
text = text_box.get("1.0", tk.END).rstrip("\n")
if not text:
messagebox.showwarning("알림", "글자를 먼저 입력해주세요!")
return
root.clipboard_clear()
root.clipboard_append(text)
messagebox.showinfo("복사 완료", "입력한 글이 클립보드에 복사됐어요!")
# 1. 메인 창
root = tk.Tk()
root.title("글자 수 세기 미니 프로그램")
root.geometry("420x320")
# 2. 위젯 배치
title_label = tk.Label(root, text="글자 수 세기", font=("맑은 고딕", 14, "bold"))
title_label.pack(pady=10)
text_box = tk.Text(root, height=8, width=45, font=("맑은 고딕", 10))
text_box.pack(padx=10)
result_label = tk.Label(root, text="공백 포함 0자 / 공백 제외 0자", font=("맑은 고딕", 11))
result_label.pack(pady=10)
copy_button = tk.Button(root, text="입력한 글 복사하기", width=20, command=copy_result)
copy_button.pack()
# 3. 이벤트 연결
text_box.bind("<KeyRelease>", count_text)
# 4. 실행
root.mainloop()📌 실행 결과
실행하면 420x320 크기의 창이 뜨고, 입력창에 글을 타이핑하는 즉시 아래에 "공백 포함 N자 / 공백 제외 N자"가 실시간으로 바뀌어요. "입력한 글 복사하기" 버튼을 누르면 복사 완료 팝업이 뜨고, 메모장이든 블로그든 Ctrl+V로 바로 붙여넣을 수 있어요!


💡 보너스 - 더블클릭으로 실행되는 진짜 프로그램 만들기
.py 파일을 exe 실행 파일로 만들면 파이썬이 없는 컴퓨터에서도 더블클릭으로 실행돼요!
pip install pyinstaller
pyinstaller --onefile --noconsole counter.py--noconsole 옵션을 붙이면 뒤에 까만 콘솔 창이 안 따라와요. dist 폴더 안에 생긴 exe 파일을 실행해보세요. 내가 만든 프로그램을 가족·친구에게 나눠줄 수도 있어요!
📌 자주 나는 에러
- ModuleNotFoundError: No module named 'tkinter'
- 원인: 일부 리눅스·맥 환경의 파이썬에는 tkinter가 빠져 있어요. (윈도우 공식 설치판은 기본 포함)
- 해결: 우분투는
sudo apt install python3-tk, 맥(Homebrew)은brew install python-tk로 설치하세요. 윈도우라면 파이썬 설치 프로그램을 다시 실행해 "tcl/tk and IDLE" 항목을 체크하면 돼요.
- 창이 떴다가 바로 꺼져요 / 아예 안 떠요
- 원인: 마지막 줄의 root.mainloop()를 빼먹은 경우가 대부분이에요.
- 해결: 코드 맨 아래에 mainloop()가 있는지 확인하세요. 창을 계속 띄워두는 필수 코드예요.
- 버튼을 누르지도 않았는데 함수가 바로 실행돼요
- 원인:
command=copy_result()처럼 괄호를 붙여서 넘긴 경우예요. 괄호를 붙이면 "함수를 등록"하는 게 아니라 "지금 즉시 실행"이 돼버려요. - 해결:
command=copy_result처럼 괄호 없이 함수 이름만 넘기세요.
- 원인:
- _tkinter.TclError: no display name and no $DISPLAY environment variable
- 원인: 화면이 없는 환경(서버, 구버전 WSL 등)에서 GUI를 띄우려고 한 경우예요.
- 해결: GUI 프로그램은 모니터가 연결된 내 PC에서 실행하세요. 서버에서 돌릴 자동화라면 GUI 없이 스크립트로 만드는 게 맞아요.
📌 마무리
오늘은 tkinter로 창 띄우기(Tk, mainloop) → 위젯 배치(Label, Text, Button + pack) → 이벤트 연결(bind, command)까지, GUI 프로그램의 뼈대를 전부 경험해봤어요. 이 3단계 구조만 알면 계산기, 메모장, 단위 변환기 같은 프로그램도 똑같은 방식으로 만들 수 있어요. 지금까지 만든 업무 자동화 스크립트에 버튼 하나 달아서 "클릭 한 번에 실행되는 프로그램"으로 업그레이드해보는 것도 추천해요! 업무 자동화 글들은 파이썬 업무 자동화 시리즈에 모아뒀어요.
다음 글에서는 파이썬 코드 실행 속도 올리는 법 5가지를 다뤄볼 예정이에요. 같은 코드도 몇 배 빨라지는 꿀팁들, 기대해주세요 🙌
