We are Architect

27. 파이썬으로 만드는 기상 상태 제공 프로그램 본문

Programing/Python

27. 파이썬으로 만드는 기상 상태 제공 프로그램

the best infra 2024. 11. 26. 17:42

* 어떤 프로그램을 만들었나?

- 기상상태 제공 프로그램을 만들어서 현재 전 세계에 있는 국가들의 날씨를 알 수 있게 만들었다. 

- 특히 api를 어떻게 가져오는지 궁금하였고 가져온 api를 어떤 식으로 활용하는지가 가장 큰 궁금증이었다.

 

 

* 사용한 툴 들

- tkinter: UI를 제공해주는 파이썬 패키지. 버튼 및 프로그램 창 등의 기능을 제공.

- tkinter.font(): UI안에 입력되는 폰트의 설정기능을 제공해 주는 함수.

- requset: http메서드 방식들 제공하는 패키지. 

 

 

* 추출한 패키지 및 모듈

# UI를 제공해 주는 패키지를 alias로 tk로 사용.
import tkinter as tk
# tkinter안에 font라는 모듈을 바로 사용 가능. 
from tkinter import font
# request 패키지 불러옴.(url 불러오기)
import requests

 

 

* 정의한 함수들

# 버튼이 잘 작동하는지 확인하는 기능.
def test_function(entry):
    print('button clicked : ', entry)

# get_weather(): 날씨정보 가져오는 함수
def get_weather(city):
    # 키 값을 weather_key변수에 넣음. 
    weather_key = '사이트에서 가져온 API키 값'
    # 버전이 아마 이상할듯
    url = 'https://api.openweathermap.org/data/2.5/weather'
    # 서버에 전달할 데이터를 저장하는 역할.
    params = {'APPID': weather_key, 'q':city, 'units':'Metric'}
    #url로 부터의 페이지 값을 가져오고 가져온 데이터를 딕셔너리에 저장한 값을 response변수에 저장.
    response = requests.get(url, params = params)
    # weather 변수안에 response값을 json형식으로 저장.
    weather = response.json()
    # josn 형식은 weather안에 있는 값들을 출력. 
    print(weather)
    # weather안에 format_respomse로 온 데이터를 텍스트 화 함. 
    label['text'] = format_response(weather)

# format_response: 추출한 데이터를 사람이 읽기 쉽게 한줄씩 띄어서 포맷팅. 
def format_response(weather):
    try:
        # weather 안에 key:'name'을 name변수에 넣음
        name = weather['name']
        # weather 안에 key:'weather'의 날씨 상태 값을 dec변수에 넣음
        dec = weather['weather'][0]['description']
        # weather 안에 key:'weather'의 현재 온도값을 temper변수에 넣음
        temper = weather['main']['temp']
        # 해당 값들을 모두 출력. 
        final_str = '도시: %s \n날씨: %s \n온도: (C)%s' %(name,dec,temper)
    except:
        # 문제가 생기면 출력. 
        final_str = '정보를 불러오는데 문제가 발생 했습니다.'
    return final_str

 

- 날씨 제공 사이트에서 api 키 값을 가져올 때는 다음과 같이 한다. 

https://home.openweathermap.org/users/sign_in

 

 

* tkinter를 이용한 UI생성 및 기능 적용

# 애플리케이션 기본 창을 생성하는 코드.
root = tk.Tk()

# 그래픽, 이미지, 도형을 배치하거나 그릴수 있는 위젯(Canvas) 사용
canvas = tk.Canvas(root, height=Height, width=Width)
# pack()은 Tkinter에서 제공하는 레이아웃 관리자
canvas.pack()

# tk.PhotoImage(): 이미지 파일을 로드
background_image = tk.PhotoImage(file='weather123.png')
# tk.Label(): 로드한 이미지를 넣을 라벨 위젯을 생성.
background_label = tk.Label(root,image=background_image)

# place(): 이미지를 원하는 위치에 배치. 
background_label.place(x=0, y=0, relwidth=1, relheight=1)

# tk.Frame(): 입력 칸과 버튼을 포함할 칸을 만든다. 
frame = tk.Frame(root,bg='#80c1ff',bd=5)
# 프레임을 설정 값에 맞게 배치한다. 
frame.place(relx=0.5, rely=0.1, relwidth=0.75, relheight=0.1, anchor='n')

# tk.Button(): 버튼에 텍스트를 넣고 버튼 클릭시에 get_weather()함수를 호출.  
button = tk.Button(frame, text='Search', font=40, command=lambda: get_weather(entry.get()))
# 버튼의 크기와 위치를 조절하는 함수.
button.place(relx=0.7, relwidth=0.3, relheight=1)

# 텍스트를 입력할 수 있는 필드를 생성
entry = tk.Entry(frame, font=40)
# 입력 필드의 위치와 크기를 조절. 
entry.place(relwidth=0.65, relheight=1)

# 결과를 표시하는 프레임
lower_frame = tk.Frame(root, bg='#80c1ff', bd=10)
# relax: 가로중앙, rely: 창 상단 아래 25%, relwidth: 창의 75%너비와 높이 60%차지
lower_frame.place(relx=0.5, rely=0.25, relwidth=0.75, relheight=0.6, anchor='n')

# 내부에 위치하며 결과 텍스트를 표시
label = tk.Label(lower_frame, font=("Arial",18))
# 라벨이 lower_frame전체 높이와 넓이를 차지.
label.place(relwidth=1, relheight=1)

# 메인 이벤트 루프(무한 실행)을 하며 이벤트 작동 및 GUI를 유지 시켜준다. 
root.mainloop()

 

 

* 완성된 프로그램

korea를 입력하여 해당 국가의 날씨 상태 값을 출력.

 

 

자료 참고 및 출처: 코딩하는 공대생님(keith Galli님 자료 참고) > https://blog.naver.com/allhpy35/221539530441