CHAPTER 6 도전, 파이썬으로 그림판과 메모장 만들기
광화문덕: 챗GPT 안녕?
챗GPT: 광화문덕!!! 오늘은 같이 어떤 파이썬 프로그램을 만들어볼까?
광화문덕: 챗GPT!!! 이젠 코드를 조금 더 복잡하게 만들어봐도 될까?
챗GPT: 물론이지! 이제는 그럼 난도를 높여볼까?
python Code
# 간단한 계산기 프로그램
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
return "0으로 나눌 수 없습니다."
else:
return a / b
# 간단한 계산기 프로그램
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
return "0으로 나눌 수 없습니다."
else:
return a / b
#프로그램 소개 및 사용자 입력
print("간단한 계산기 프로그램입니다.")
num1 = float(input("첫 번째 숫자를 입력하세요: "))
num2 = float(input("두 번째 숫자를 입력하세요: "))
광화문덕: 챗GPT~!!! 계산기를 만들었어~~~
챗GPT: 광화문덕~! 오~~ 멋진데~~ 근데 뭔가 빠진 것 같지 않아??
광화문덕: 챗GPT! 코드를 좀 고쳐주겠어?
python Code
# 간단한 계산기 프로그램
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
return "0으로 나눌 수 없습니다."
else:
return a / b
#프로그램 소개 및 사용자 입력
print("간단한 계산기 프로그램입니다.")
num1 = float(input("첫 번째 숫자를 입력하세요: "))
num2 = float(input("두 번째 숫자를 입력하세요: "))
operator = input("사용할 연산자를 입력하세요 (+, -, *, /): ")
#사용자 입력값 계산
if operator == '+':
result = add(num1, num2)
elif operator == '-':
result = subtract(num1, num2)
elif operator == '*':
result = multiply(num1, num2)
elif operator == '/':
result = divide(num1, num2)
else:
result = "올바른 연산자를 입력해 주세요."
#연산 결괏값 출력
print("결과:", result)
챗GPT: 광화문덕! 사용자로부터 계산하고자 하는 숫자들을 입력받는 데까지는 완벽했는데 숫자를 입력받아서 계산을 실행하는 부분이 빠졌더라고! 그래서 operator 부분을 추가했어. 그리고 사용자에게 계산 결과도 보여줘야겠지~!
광화문덕 : 멋진 프로그램이야! 코드를 잘 구조화하고, 함수와 조건문도 멋지게 구현돼 있는 걸! 나도 언젠가는 이렇게 빠뜨림 없이 코드를 작성하는 날이 오겠지?
챗GPT : 그럼 그럼 지금도 충분히 잘하고 있으니 걱정 말라고! 분명 멋진 프로그램을 만들 수 있을 거야~ 그러니 너무 조바심 내지 말고 차근차근해보자~!
광화문덕 : 정말 기대돼! 더 많은 기능을 넣고 싶어!
챗GPT : 광화문덕의 열정이라면, 분명 놀라운 프로그램을 만들 수 있을 거야.
이제 좀 더 복잡한 기능을 시도해 볼까?
예를 들어, 계산기 프로그램에 특정 오류 처리를 추가해 보거나, 사용자와 자연스럽게 대화하는 기능을 넣어볼 수 있을 것 같은데!
광화문덕 : 오, 그건 좋은 아이디어이 걸! 한 번 시도해 볼게.
python Code
# 발전된 계산기 프로그램
#계산기 기본 연산 기능
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
return "0으로 나눌 수 없습니다."
else:
return a / b
#프로그램 소개 및 실행
print("발전된 계산기 프로그램입니다.")
while True:
#사용자가 '종료'를 입력하면 프로그램 종료
user_input = input("수식을 입력하세요 (예: 2 + 3, 종료하려면 '종료' 입력): ")
if user_input.lower() == "종료":
print("프로그램을 종료합니다.")
break
try:
num1, operator, num2 = user_input.split()
num1 = float(num1)
num2 = float(num2)
if operator == '+':
result = add(num1, num2)
elif operator == '-':
result = subtract(num1, num2)
elif operator == '*':
result = multiply(num1, num2)
elif operator == '/':
result = divide(num1, num2)
else:
print("올바른 연산자를 입력해 주세요.")
continue
#연산 결과 출력
print("결과:", result)
#예상치 못한 입력에 따른 오류 처리
except ValueError:
print("잘못된 입력입니다. 수식을 정확히 입력해 주세요.")
챗GPT: 와, 정말 멋진 기능이 추가되었네! 이제 프로그램이 사용자와 자연스럽게 대화하는 느낌이야. 더욱 전문적인 프로그래머가 되어가고 있어.
광화문덕 : 고마워! 챗GPT 덕분에 발전할 수 있었어. 이제 더 많은 아이디어를 시도해 봐야겠어.
챗GPT : 정말 멋진 아이디어인 걸! 그림판과 메모장은 사용자들에게 유용하고 창의적인 기능을 제공하는 프로그램이야. 이제 어떻게 시작해야 할까?
챗GPT : 맞아! 광화문덕이 작성한 코드가 복잡해지면 질수록 코드에 대한 설명인 '주석' 부분이 정말 도움이 많이 돼!
그런데 주석이라는 것이 꼭 다른 사람을 위한 것은 아니야. 자신을 위한 것이기도 해!
프로그램을 작성할 때에는 모든 로직을 이해하고 있겠지만, 나중에 시간이 흘러서 코드를 다시 보게 된다면 혼란스러울 수 있거든! 지금의 내가 아닌 미래의 나를 위해 적어두는 친절한 코멘트라고 생각해 주면 좋을 것 같아
python Code
# 그림판 프로그램
import tkinter as tk
class PaintApp:
#그림판 실행 화면
def __init__(self, root):
self.root = root
# 윈도우 제목 설정
self.root.title("그림판")
# 윈도우 크기 설정
self.root.geometry("800x600")
# 흰 배경의 캔버스 생성
self.canvas = tk.Canvas(self.root, bg="white")
# 캔버스를 윈도우에 채우고 윈도우 크기에 따라 캔버스 크기 조정
self.canvas.pack(fill=tk.BOTH, expand=True)
# 그리기 색상을 기본적으로 검은색으로 설정
self.draw_color = "black"
# 캔버스에서 마우스 왼쪽 버튼 드래그 이벤트를 paint 메서드와 연결
self.canvas.bind("<B1-Motion>", self.paint)
# "색상 선택" 버튼 생성
self.color_button = tk.Button(self.root, text="색상 선택", command=self.choose_color)
# 버튼을 윈도우에 배치
self.color_button.pack()
#그림 그리기 기능
def paint(self, event):
# 현재 이벤트 좌표 기준으로 시작점 좌표 설정 (사각형 그리기 위해 각각 2씩 빼고 더함)
x1, y1 = (event.x - 2), (event.y - 2)
# 현재 이벤트 좌표 기준으로 끝점 좌표 설정 (사각형 그리기 위해 각각 2씩 더하고 뺌)
x2, y2 = (event.x + 2), (event.y + 2)
# 캔버스에 타원을 그리는데, 시작점과 끝점 좌표로 사각형을 그려 타원처럼 보이도록 함
self.canvas.create_oval(x1, y1, x2, y2, fill=self.draw_color, outline=self.draw_color)
# 색상 선택 대화상자를 띄워 사용자가 원하는 색상을 선택하도록 함
def choose_color(self):
self.draw_color = tk.colorchooser.askcolor(color=self.draw_color)[1]
#Python 스크립트가 직접 실행되었을 때, 내부의 코드 블록을 실행하라는 조건문
if __name__ == "__main__":
# Tkinter 윈도우 생성
root = tk.Tk()
# 그림판 애플리케이션을 위한 객체 생성
app = PaintApp(root)
# 윈도우 이벤트 루프 실행하여 그림판 애플리케이션을 시작
root.mainloop()
python Code
# 발전된 그림판 프로그램
import tkinter as tk
class PaintApp:
#그림판 실행 화면
def __init__(self, root):
self.root = root
# 윈도우 제목 설정
self.root.title("그림판")
# 윈도우 크기 설정
self.root.geometry("800x600")
# 흰 배경의 캔버스 생성
self.canvas = tk.Canvas(self.root, bg="white")
# 캔버스를 윈도우에 채우고 윈도우 크기에 따라 캔버스 크기 조정
self.canvas.pack(fill=tk.BOTH, expand=True)
# 그리기 색상을 기본적으로 검은색으로 설정
self.draw_color = "black"
# 캔버스에서 마우스 왼쪽 버튼 드래그 이벤트를 paint 메서드와 연결
self.canvas.bind("<B1-Motion>", self.paint)
# "색상 선택" 버튼 생성
self.color_button = tk.Button(self.root, text="색상 선택", command=self.choose_color)
# 버튼을 윈도우에 배치
self.color_button.pack()
#그림 그리기 기능
def paint(self, event):
# 현재 이벤트 좌표 기준으로 시작점 좌표 설정 (사각형 그리기 위해 각각 2씩 빼고 더함)
x1, y1 = (event.x - 2), (event.y - 2)
# 현재 이벤트 좌표 기준으로 끝점 좌표 설정 (사각형 그리기 위해 각각 2씩 더하고 뺌)
x2, y2 = (event.x + 2), (event.y + 2)
# 캔버스에 타원을 그리는데, 시작점과 끝점 좌표로 사각형을 그려 타원처럼 보이도록 함
self.canvas.create_oval(x1, y1, x2, y2, fill=self.draw_color, outline=self.draw_color)
# 색상 선택 대화상자를 띄워 사용자가 원하는 색상을 선택하도록 함
def choose_color(self):
self.draw_color = tk.colorchooser.askcolor(color=self.draw_color)[1]
#그리기 도구 선택
def select_tool(self, tool):
# 사용자가 선택한 그리기 도구를 현재 선택된 도구로 설정
self.draw_tool = tool
#Python 스크립트가 직접 실행되었을 때, 내부의 코드 블록을 실행하라는 조건문
if __name__ == "__main__":
# Tkinter 윈도우 생성
root = tk.Tk()
# 그림판 애플리케이션을 위한 객체 생성
app = PaintApp(root)
# 윈도우 이벤트 루프 실행하여 그림판 애플리케이션을 시작
root.mainloop()
광화문덕 : 정말 수고했어! 더 다양한 그리기 도구를 추가하여 사용자들이 창의적인 그림을 그릴 수 있게 됐네
챗GPT : 그럼 우리 메모장 프로그램을 만들고 텍스트 영역에는 간단히 메모를 작성하고 ‘저장’ 버튼을 클릭하면 메모를 텍스트 파일로 저장하도록 해볼까?
python Code
# 메모장 프로그램
class MemoApp:
#메모장 실행 화면
def __init__(self, root):
self.root = root
self.root.title("메모장") # 윈도우 제목 설정
self.root.geometry("600x400") # 윈도우 크기 설정
self.text_area = tk.Text(self.root) # 텍스트 입력 위젯 생성
# 텍스트 입력 위젯을 윈도우에 채우고 윈도우 크기에 따라 크기 조정
self.text_area.pack(fill=tk.BOTH, expand=True)
self.save_button = tk.Button(self.root, text="저장", command=self.save_memo)
# "저장" 버튼 생성, 클릭 시 save_memo 메서드를 호출하도록 설정
# 버튼을 윈도우에 배치
self.save_button.pack()
#메모장 내용 저장 기능
def save_memo(self):
# 텍스트 입력 위젯의 내용을 가져옴, 1.0은 첫 번째 줄 첫 번째 문자를 의미
# tk.END는 텍스트 입력의 끝까지 의미
content = self.text_area.get("1.0", tk.END)
file_name = tk.filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")])
# 파일 다이얼로그를 띄워 사용자에게 저장할 파일명을 입력받음
# 기본 확장자는 .txt로 설정하며, 텍스트 파일과 모든 파일을 선택할 수 있도록 설정
# 파일명이 유효한 경우
if file_name:
# 선택한 파일명으로 파일을 열어서 쓰기 모드로 열고 파일 객체 생성
with open(file_name, "w") as file:
# 파일에 메모 내용을 씀
file.write(content)
# 저장 완료 메시지 출력
print("메모가 저장되었습니다.")
#Python 스크립트가 직접 실행되었을 때, 내부의 코드 블록을 실행하라는 조건문
if __name__ == "__main__":
# Tkinter 윈도우 생성
root = tk.Tk()
# 메모장 애플리케이션을 위한 객체 생성
app = MemoApp(root)
# 윈도우 이벤트 루프 실행하여 메모장 애플리케이션을 시작
root.mainloop()
챗GPT : 정말 멋지고 유용한 프로그램이야! 더 많은 사람들이 사용하고 좋아할 거야. 계속해서 코딩을 즐기며 더 큰 세계로 나아가자.
광화문덕은 자신이 만든 프로그램들을 마을 사람들과 공유해보고 싶은 마음이 들었다. 광화문덕과 챗GPT는 성취의 기쁨을 공유하고 있었다.
if __name__ == "__main__": 란?
Python 스크립트가 직접 실행되었을 때 (즉, 모듈로서 다른 스크립트에서 import 되지 않고 직접 실행되었을 때) 내부의 코드 블록을 실행하라는 조건문이다.
Python에서는 스크립트 파일이 직접 실행되었을 때와 모듈로서 다른 스크립트에서 import 되었을 때를 구분할 수 있다. 이 구분은 __name__이라는 내장 변수를 이용한다.
__name__이 "__main__"인 경우: 스크립트 파일이 직접 실행되었을 때입니다. 이 경우에는 if __name__ == "__main__": 이하의 코드 블록이 실행됩니다.
__name__이 스크립트의 모듈명인 경우: 스크립트 파일이 다른 스크립트에서 import 되었을 때다. 이 경우에는 if __name__ == "__main__": 이하의 코드 블록은 실행되지 않는다.
따라서, if __name__ == "__main__": 이하의 코드 블록은 해당 스크립트 파일을 직접 실행할 때만 실행되며, 다른 스크립트에서 이 파일을 import 할 경우에는 실행되지 않는다다. 이를 통해 해당 스크립트를 독립적인 실행 파일로 사용할 수 있도록 합니다. 일반적으로 스크립트의 메인 로직을 이 조건문 안에 작성하여 실행 시에 원하는 동작을 수행하도록 한다.