Python GUI 계산기, 윈도우 EXE와 맥OS 앱으로 만들기

Python으로 간단한 계산기를 만들어봤는데, 친구한테 보내려니까 Python 설치되어 있지 않으면 못 쓰더라구요. 그래서 찾아본 게 PyInstaller와 py2app이었는데, 처음 써보면서 의외로 간단한 부분도 있고 헷갈리는 부분도 있었어요.
윈도우에서는 PyInstaller로 단일 exe 파일로, 맥북에서는 py2app으로 .app 번들 형태로 만드는 방법을 직접 해보면서 정리했습니다.
Python GUI 계산기 예제 코드
먼저 간단한 계산기 GUI 코드부터 만들어야 합니다. tkinter 라이브러리를 사용하면 Python 기본 라이브러리라서 별도 설치 없이 바로 쓸 수 있습니다.
# calculator.py
import tkinter as tk
from tkinter import ttk
class Calculator:
def __init__(self, root):
self.root = root
self.root.title("간단 계산기")
self.root.geometry("400x500")
self.root.resizable(False, False)
self.result_var = tk.StringVar()
self.result_var.set("0")
self.create_widgets()
def create_widgets(self):
# 결과 표시 화면
result_frame = tk.Frame(self.root, bg="#2c3e50", padx=10, pady=10)
result_frame.pack(fill=tk.BOTH, expand=True)
result_label = tk.Label(
result_frame,
textvariable=self.result_var,
font=("Arial", 32, "bold"),
bg="#2c3e50",
fg="white",
anchor="e"
)
result_label.pack(fill=tk.BOTH, expand=True)
# 버튼 프레임
button_frame = tk.Frame(self.root)
button_frame.pack(fill=tk.BOTH, expand=True)
# 버튼 배치 (4x4 그리드)
buttons = [
['7', '8', '9', '/'],
['4', '5', '6', '*'],
['1', '2', '3', '-'],
['C', '0', '=', '+']
]
for i, row in enumerate(buttons):
for j, btn_text in enumerate(row):
button = tk.Button(
button_frame,
text=btn_text,
font=("Arial", 18, "bold"),
bg="#ecf0f1" if btn_text not in ['=', 'C'] else "#3498db",
fg="black" if btn_text not in ['=', 'C'] else "white",
activebackground="#bdc3c7",
command=lambda x=btn_text: self.on_button_click(x)
)
button.grid(row=i, column=j, sticky="nsew", padx=2, pady=2)
# 그리드 가중치 설정
for i in range(4):
button_frame.grid_rowconfigure(i, weight=1)
button_frame.grid_columnconfigure(i, weight=1)
def on_button_click(self, value):
current = self.result_var.get()
if value == 'C':
self.result_var.set("0")
elif value == '=':
try:
result = eval(current)
self.result_var.set(str(result))
except:
self.result_var.set("오류")
else:
if current == "0" or current == "오류":
self.result_var.set(value)
else:
self.result_var.set(current + value)
def main():
root = tk.Tk()
app = Calculator(root)
root.mainloop()
if __name__ == "__main__":
main()
위 코드를 calculator.py로 저장하면 됩니다. 터미널에서 python calculator.py로 실행해보면 계산기 창이 뜨는 걸 확인할 수 있어요.
윈도우에서 EXE 단일 파일로 만들기
윈도우에서는 PyInstaller를 사용합니다. Python 3.7 이상이면 대부분 호환됩니다.
PyInstaller 설치
pip install pyinstaller
단일 실행 파일 생성
가장 기본적인 명령어는 다음과 같습니다.
pyinstaller --onefile --noconsole calculator.py
옵션 설명:
--onefile: 모든 의존성을 포함한 단일 exe 파일 생성--noconsole: 콘솔 창 없이 GUI만 표시 (tkinter 앱에서 필수)--icon=icon.ico: 실행 파일 아이콘 변경 (선택사항)
실행 파일 위치
명령어 실행 후 프로젝트 폴더에 dist 폴더가 생성됩니다.
프로젝트 폴더/
├── calculator.py
├── build/ (임시 빌드 파일)
├── dist/
│ └── calculator.exe (최종 실행 파일!)
└── calculator.spec
dist/calculator.exe 파일을 다른 윈도우 PC로 복사해서 바로 실행할 수 있습니다.

실행 속도 이슈
—onefile 옵션은 편리하지만 실행 시 압축 해제 과정 때문에 처음 실행이 느립니다. 제 경험상 간단한 GUI 앱도 첫 실행에 3~5초 정도 걸렸어요.
빠른 실행이 필요하다면:
pyinstaller --noconsole calculator.py
이렇게 하면 dist/calculator 폴더에 여러 파일이 생기지만, 실행 속도는 훨씬 빠릅니다. 배포 시 폴더 전체를 압축해서 전달하면 됩니다.
맥OS에서 앱 패키지로 만들기
맥북에서는 py2app을 사용합니다. 윈도우의 PyInstaller와 비슷한 역할이지만 macOS 전용입니다.
py2app 설치
pip install py2app
setup.py 파일 생성
py2app은 setup.py 설정 파일이 필요합니다. 프로젝트 폴더에 다음 파일을 생성하세요.
# setup.py
from setuptools import setup
APP = ['calculator.py']
DATA_FILES = []
OPTIONS = {
'argv_emulation': True,
'packages': ['tkinter'],
'iconfile': 'icon.icns', # 선택사항: 맥용 아이콘 파일
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
앱 번들 생성
python setup.py py2app
실행하면 dist 폴더에 calculator.app 번들이 생성됩니다.
프로젝트 폴더/
├── calculator.py
├── setup.py
├── build/
└── dist/
└── calculator.app (macOS 앱 번들!)
ARM64 (M1/M2/M3 맥북) 지원
2025년 최신 py2app은 Apple Silicon을 자동으로 지원합니다. macOS 11 이상에서는 ad-hoc 코드 서명도 자동으로 추가됩니다.
만약 Universal 2 바이너리(Intel + ARM64 동시 지원)로 만들고 싶다면:
python setup.py py2app --arch universal2
배포 방법
생성된 calculator.app을 다른 맥북으로 복사하면 바로 실행됩니다. 단, Gatekeeper 때문에 처음 실행 시 경고가 뜰 수 있어요.
경고 해결 방법:
- 앱을 우클릭 → “열기” 선택
- 또는 시스템 환경설정 → 보안 및 개인정보 보호 → “확인 없이 열기”
운영자 실전 노트
세븐핑거스가 직접 패키징하면서 겪은 문제들입니다.
윈도우 PyInstaller 관련
문제 1: 백신 프로그램이 exe 파일을 악성코드로 인식
PyInstaller로 만든 exe 파일을 실행하려는데 백신이 차단하더라구요. 특히 —onefile 옵션 사용 시 자주 발생합니다.
해결: 백신 예외 처리 등록하거나, 코드 서명(Code Signing) 인증서 구매해야 함. 개인 프로젝트라면 예외 등록으로 충분합니다.
문제 2: 실행 시 “Failed to execute script” 오류
경로 문제일 확률이 높습니다. 이미지나 데이터 파일을 상대 경로로 불러오면 exe로 만들었을 때 경로가 안 맞아요.
해결: --add-data 옵션으로 리소스 파일 포함시키기.
pyinstaller --onefile --noconsole --add-data "icon.png;." calculator.py
맥OS py2app 관련
문제 3: “damaged and can’t be opened” 메시지
py2app으로 만든 앱을 다른 맥에서 열 때 이 메시지가 뜹니다. Gatekeeper가 서명되지 않은 앱을 차단하기 때문입니다.
해결: 개발자 계정으로 앱 서명하거나, 사용자에게 우클릭 → 열기 방법 안내.
문제 4: tkinter import 오류
setup.py에서 ‘packages’: [‘tkinter’] 옵션을 빼먹으면 앱 실행 시 모듈을 찾을 수 없다는 오류가 납니다.
해결: OPTIONS 딕셔너리에 사용하는 모든 패키지를 명시해야 함.
공통 이슈
문제 5: 파일 크기가 너무 큼
간단한 계산기인데 exe/app 파일이 30~50MB나 되더라구요. Python 인터프리터와 모든 라이브러리가 포함되기 때문입니다.
해결 방법은 없고, 이게 정상입니다. 용량이 중요하다면 가상환경에서 최소한의 패키지만 설치 후 빌드하면 조금 줄어듭니다.
윈도우 vs 맥OS 비교 테이블
| 항목 | 윈도우 (PyInstaller) | 맥OS (py2app) |
|---|---|---|
| 설치 명령어 | pip install pyinstaller | pip install py2app |
| 설정 파일 | 불필요 (.spec 자동 생성) | setup.py 필수 |
| 빌드 명령어 | pyinstaller --onefile --noconsole app.py | python setup.py py2app |
| 결과 파일 | .exe (단일 실행 파일) | .app (번들 폴더) |
| 첫 실행 속도 | 느림 (—onefile 사용 시) | 빠름 |
| 코드 서명 | 선택사항 | M1 이상 자동 ad-hoc 서명 |
| 백신 오탐 | 자주 발생 | 거의 없음 |
FAQ
Q. PyInstaller로 만든 exe 파일이 실행이 너무 느려요. 어떻게 하나요?
—onefile 옵션을 빼고 빌드하면 실행 속도가 훨씬 빠릅니다. 대신 dist 폴더에 여러 파일이 생기는데, 폴더 전체를 압축해서 배포하면 됩니다. 사용자 입장에서는 압축 풀고 exe 파일만 실행하면 되니까 크게 불편하지 않습니다.
Q. 맥북 M1에서 만든 앱을 Intel 맥에서도 실행할 수 있나요?
py2app 빌드 시 --arch universal2 옵션을 추가하면 Intel과 ARM64를 모두 지원하는 Universal 바이너리로 만들어집니다. 단, 파일 크기는 2배 가까이 커집니다.
Q. 아이콘을 바꾸고 싶은데 어떻게 하나요?
윈도우는 .ico 파일, 맥OS는 .icns 파일이 필요합니다. 온라인 변환 도구로 png를 ico/icns로 변환 후 PyInstaller는 --icon=icon.ico, py2app은 setup.py의 OPTIONS에 'iconfile': 'icon.icns'를 추가하면 됩니다.
마치며
Python으로 만든 GUI 앱을 실행 파일로 배포하는 건 생각보다 간단했습니다. PyInstaller와 py2app 모두 기본 옵션만 써도 충분히 동작하는 파일이 나와요.
처음엔 백신 오탐이나 실행 속도 문제로 헤맸지만, 옵션 조정하고 나니 문제없이 배포할 수 있었어요. 친구들한테 Python 설치 없이 바로 쓸 수 있는 프로그램 보내줄 수 있어서 편하더라구요.
다음에는 GUI 프레임워크를 PyQt나 Kivy로 바꿔서 좀 더 세련된 디자인으로 만들어볼 생각입니다.
Sources:
- Learn Python: Convert Tkinter App to EXE – Package Python GUI with PyInstaller
- How to Create an Executable (.exe) File from a Python GUI Calculator | Medium
- Packaging Tkinter applications for Windows, with PyInstaller & InstallForge
- py2app - Create standalone Mac OS X applications with Python
- How to Create a Mac OS X App with Python
- PyInstaller로 인스톨러 exe 파일 개발하기 | Medium
- Pyinstaller 자주 사용하는 옵션 모음 - Taedi’s Log