초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 1부
2024. 10. 21. 23:16ㆍ코딩 연습/아날로그 시계 만들기
평상시 코딩 연습을 안 한 사람이라면 아무리 관련 학과를 나왔어도 프로그램 하나 못 만든다. 에이, 설마 그럴까? 라고 생각하는 분도 있겠지만, 일단 나는 그렇다. 그래서 취미로 프로그램을 만들려고 해도 쉽지 않았다. 그러던 중 ChatGPT가 코딩을 도와줄 수 있다는 것을 보고 써봤는데 생각보다 굉장한 수준이다. 물론 아직까지는 처음부터 끝까지 복잡한 프로그램을 다 만들어 주진 못한다. 프로그램이 커지면 긴 코드를 다 적어주지도 못하고, 적당히 쪼개 오려붙이면 오류가 나게 된다.
그래도 코드 한줄한줄이 막막한 사람에겐 그저 빛이다.
코딩연습차 GPT를 활용해 간단한 어플인 시계 어플을 만들어보고자 한다. 만드는 이유는 기존에 잘 쓰고 있던 시계 어플이 아쉽게도 윈도우 스토어에서 내려갔기 때문이다. 멋진 사진을 배경으로 단순한 아날로그 시계였는데, 디지털 시계보다 아날로그 시계가 지금 몇 시인지 한눈에 들어오기 때문에 잘 쓰던 어플이었다.
프로그램을 만들기 앞서 우선 필요한 것을 정리해보자.
필요 목록
- 디지털 시계가 아닌 아날로그 시계가 나와야한다.
- 시계 뒤에 배경에 초기 사진이 있다.
- 사진은 사용자가 바꿀 수 있어야 한다.
- 다음에 켰을 때 마지막으로 썼던 사진이 기본값으로 나온다.
- 시계 화면은 창크기에 맞게 변해야한다.
- 필요에 따라 항상 맨 앞 창으로 나와있을 수 있도록 옵션을 제공해야한다.
이제 이걸 GPT에 그대로 물어본다. "이런 기능이 필요한데 윈도우에서 작동하는 코드를 짜줄래"라고 하면 짜준다. 참고로 나는 ChatGPT를 유료구독한다. 글을 쓰는 시점에선 ChatGPT 4o 버전이 최신 버전인데, 그 중에서도 코딩을 더 전문적으로 도와주는 canvas 버전으로 물어봤다.
이제 바로 아래와 같은 코드가 나왔다. 어떤 언어로 쓰라고 굳이 말을 안 해 요즘 많이 쓰는 파이썬으로 코드를 짜줬는데, 특정 언어가 필요하면 그것도 요구사항에 넣으면 바로바로 반영해서 다시 짜준다.
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import time
import math
import os
import json
CONFIG_FILE = "config.json"
class AnalogClockApp:
def __init__(self, root):
self.root = root
self.root.title("Analog Clock with Custom Background")
self.load_config()
self.canvas = tk.Canvas(root, width=400, height=400)
self.canvas.pack(fill="both", expand=True)
self.always_on_top = tk.BooleanVar()
self.always_on_top.set(self.config.get("always_on_top", False))
self.root.attributes("-topmost", self.always_on_top.get())
self.menu = tk.Menu(root)
root.config(menu=self.menu)
self.options_menu = tk.Menu(self.menu, tearoff=0)
self.menu.add_cascade(label="Options", menu=self.options_menu)
self.options_menu.add_command(label="Change Background Image", command=self.change_background_image)
self.options_menu.add_checkbutton(label="Always on Top", onvalue=True, offvalue=False, variable=self.always_on_top, command=self.toggle_always_on_top)
self.background_image = None
if self.config.get("background_image"):
self.load_background_image(self.config["background_image"])
self.update_clock()
self.root.mainloop()
def load_config(self):
if os.path.exists(CONFIG_FILE):
with open(CONFIG_FILE, "r") as file:
self.config = json.load(file)
else:
self.config = {}
def save_config(self):
with open(CONFIG_FILE, "w") as file:
json.dump(self.config, file)
def load_background_image(self, image_path):
try:
image = Image.open(image_path)
image = image.resize((400, 400), Image.ANTIALIAS)
self.background_image = ImageTk.PhotoImage(image)
self.canvas.create_image(0, 0, anchor="nw", image=self.background_image)
except Exception as e:
print(f"Error loading background image: {e}")
def change_background_image(self):
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png;*.jpg;*.jpeg;*.bmp")])
if file_path:
self.config["background_image"] = file_path
self.save_config()
self.load_background_image(file_path)
def toggle_always_on_top(self):
self.root.attributes("-topmost", self.always_on_top.get())
self.config["always_on_top"] = self.always_on_top.get()
self.save_config()
def update_clock(self):
self.canvas.delete("clock")
width = self.canvas.winfo_width()
height = self.canvas.winfo_height()
radius = min(width, height) // 2 - 10
center_x = width // 2
center_y = height // 2
# Draw clock face
self.canvas.create_oval(center_x - radius, center_y - radius, center_x + radius, center_y + radius, outline="black", tags="clock")
# Get current time
current_time = time.localtime()
hours = current_time.tm_hour % 12
minutes = current_time.tm_min
seconds = current_time.tm_sec
# Draw hour hand
hour_angle = math.radians((hours + minutes / 60) * 30 - 90)
hour_x = center_x + radius * 0.5 * math.cos(hour_angle)
hour_y = center_y + radius * 0.5 * math.sin(hour_angle)
self.canvas.create_line(center_x, center_y, hour_x, hour_y, width=6, fill="black", tags="clock")
# Draw minute hand
minute_angle = math.radians((minutes + seconds / 60) * 6 - 90)
minute_x = center_x + radius * 0.7 * math.cos(minute_angle)
minute_y = center_y + radius * 0.7 * math.sin(minute_angle)
self.canvas.create_line(center_x, center_y, minute_x, minute_y, width=4, fill="black", tags="clock")
# Draw second hand
second_angle = math.radians(seconds * 6 - 90)
second_x = center_x + radius * 0.9 * math.cos(second_angle)
second_y = center_y + radius * 0.9 * math.sin(second_angle)
self.canvas.create_line(center_x, center_y, second_x, second_y, width=2, fill="red", tags="clock")
self.root.after(1000, self.update_clock)
if __name__ == "__main__":
root = tk.Tk()
app = AnalogClockApp(root)
나의 경우 3번째 줄 from PIL 에서 바로 오류가 났다.
코드 자체가 오류는 아니고 아마 PIL이란 파이썬 라이브러리가 내 컴퓨터에 깔리지 않았기 때문일 것인데 윈도우 cmd 창을 켜서 명령어에 파이썬 라이브러리를 설치해주는 명령어 pip install PIL를 입력 했더니 찾을 수 없는 라이브러리라 뜬다.
예전에는 인터넷 검색을 통해 알아봤겠지만 이제 그럴 필요가 없다. 인공지능에 물어보면 끝이다. 저 부분에서 오류가 난다고 물어보면 바로 pip install Pillow 를 쓰라고 알려준다. 요즘은 이런 세상이다. 공부하기 너무 좋다.
대충 보이는 오류는 해결했으니 실행해본다.
신기하게 시계가 바로 나온다. 옵션에 보면 항상 창 위에도 지원하고 잘 작동한다. 창 크기를 바꾸면 시계 크기도 창 크기에 딱 맞게 조정된다.
하지만 초기에 배경이 되는 사진은 없고, 사진을 바꾸려고 해도 오류가 나며 바뀌지 않는다.
다음 글에서 이러한 오류를 잡아보도록 하겠다.
'코딩 연습 > 아날로그 시계 만들기' 카테고리의 다른 글
초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 9부(배포판 수정, 최적화 2) (1) | 2024.10.28 |
---|---|
초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 8부(배포판 수정, 최적화 1) (3) | 2024.10.27 |
초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 7부(배포판 수정, 레지스트리를 사용해 저장하기) (1) | 2024.10.24 |
초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 6부(배포판 만들기) (3) | 2024.10.24 |
초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 5부(1차 완성) (1) | 2024.10.23 |
초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 4부 (2) | 2024.10.22 |
초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 3부 (0) | 2024.10.22 |
초간단 아날로그 시계 만들기 - GPT를 이용한 코딩 연습 - 2부 (2) | 2024.10.21 |