나른한 코딩 생활

[34일차] ABC 부트캠프 프로젝트 - 4 본문

ABC 부트캠프

[34일차] ABC 부트캠프 프로젝트 - 4

GerHerMo 2024. 8. 11. 20:17

오전

피그마로 디자인 확립

디자인 담당의 인원이 Figma로 시간을 깎아가면서 만든 G-SOK앱의 디자인

자료조사 및 프로토타입 데이터 적용

여행 사이트에서 1박 기준으로 임의의 목적지 정하기 - 부산 & 여수 보물섬

 

위 시각화 데이터를 토대로 어제 시험했던 웹 크롤링의 목적지로 정한다

 

탄소 에너지 사용량 중 수송 16.6% 차지를 파이차트로 시각화

 

랜덤 이미지 출력

어제부터 맵과 함께 만들고 있던 랜덤 이미지출력의 기본 틀을 잡았다

import tkinter as tk
from PIL import Image, ImageTk
import random
import os

emission_co2 = 0.0
footprint_co2 = 0

def set_emission_co2(value):
    global emission_co2
    emission_co2 = value

def set_footprint_co2(value):
    global footprint_co2
    footprint_co2 = value

def Dp_Random_Img(image_folder):
    # 이미지 폴더의 모든 파일을 가져옴

    image_files = [f for f in os.listdir(image_folder) if f.endswith(('png', 'jpg', 'jpeg', 'gif'))]

    # 이미지와 관련된 데이터를 리스트로 관리
    image_data = {
        'tree.jpg': (12, '그루', '나무'),
        'bee.png': (5, '마리', '벌'),
        'sunflower.jpg': (8, '송이', '해바라기')
    }

    # 랜덤으로 이미지 파일 선택
    selected_image = random.choice(image_files)

    # 이미지 파일 경로
    image_path = os.path.join(image_folder, selected_image)

    # 선택된 이미지에 따른 변수 설정
    if selected_image in image_data:
        n, unit, random_obj = image_data[selected_image]
    else:
        n, unit, random_obj = (1, '개', '알 수 없는 객체')

    # 최상단에 표시할 텍스트와 폰트
    top_text = f"고마워요! 덕분에 {n}{unit}의 {random_obj}들을 지켰어요!"
    top_text_font = ("NanumGothic", 20, "bold")

    # 출력할 텍스트 라인과 폰트
    text_lines = [
        f"총 {emission_co2}kg의 탄소배출량이 감소했어요!",
        f"현재까지 '{footprint_co2}' 만큼의 탄소발자국을 줄였어요!",
        "Thank you for your doing"
    ]
    text_font = ("NanumGothic", 14)

    # Tkinter 창 생성
    root = tk.Tk()
    root.title("G-SOK Map")

    # 최상단 텍스트 라벨 추가
    top_text_label = tk.Label(root, text=top_text, font=top_text_font)
    top_text_label.pack(pady=10)

    # 이미지를 로드하고 표시
    img = Image.open(image_path)
    img = img.resize((600, 500),Image.Resampling.LANCZOS)
    # Image.Resampling.LANCZOS : 이미지 리사이즈시 화질 저하를 완화해주는 코드 // pillow 10.0.0 버전 이후 함수명 바뀜
    img = ImageTk.PhotoImage(img)

    panel = tk.Label(root, image=img)
    panel.pack(side="top", fill="both", expand="yes")

    # 텍스트 라벨 추가
    for line in text_lines:
        text_label = tk.Label(root, text=line, font=text_font)
        text_label.pack()

    # Tkinter 이벤트 루프 시작
    root.mainloop()

# 이미지 폴더 경로
image_folder = "C:/ABCBootCamp/G_SOK_MAP_Project/ImgFolder"

Dp_Random_Img(image_folder)

나무 / 해바라기 / 꿀벌 중에 실행시 랜덤한 이미지로 보여준다


오후

이동수단별 탄소배출량 계산

emissions_data = {
    "S_Flight": {
        "emission": 255.0,
        "scope": "Scope 1",
        "speed": 850
    },
    "L_Flight": {
        "emission": 150.0,
        "scope": "Scope 1",
        "speed": 925
    },
    "Gasoline_Car": {
        "emission": 192.0,
        "scope": "Scope 1",
        "speed": 57 # 고속도로와 일반도로 평균값의 평균
    },
    "Diesel_Car": {
        "emission": 171.0,
        "scope": "Scope 1",
        "speed": 57
    },
    "Bus": {
        "emission": 105.0,
        "scope": "Scope 1",
        "speed": 22
    },
    "Subway":{
        "emission": 26.0,
        "scope": "Scope 1",
        "speed": 50
    },
    "Electric_Car": {
        "emission": 53.0,
        "scope": "Scope 2",
        "speed": 46 # 출처 : https://www.wltpfacts.eu/from-nedc-to-wltp-change/
    },
    "Electric_Bicycle": {
        "emission": 12.0,
        "scope": "Scope 2",
        "speed": 17 # 평균 15~20 km/h
    },
    "Train": {
        "KTX": {
            "emission": 19.92,
            "scope": "Scope 2",
            "speed": 180
        },
        "KTX_Sancheon_and_Mugunghwa": {
            "emission": 38.105,
            "scope": "Scope 2",
            "speed": 120 # KTX 산천과 무궁화호의 평균속도
        },
        "Nuriro_and_ITX_Cheongchun_and_ITX_Saemaeul": {
            "emission": 27.19,
            "scope": "Scope 2",
            "speed": 140 # 누리호, ITX 의 평균속도
        }
    }
}

class VehicleCo2:
    def __init__(self,bus_time=0.0,subway_time=0.0,s_flight_time=0.0,l_flight_time=0.0,
                 gasoline_car_time=0.0,diesel_car_time=0.0,electric_car_time=0.0,
                 train_time=0.0,electric_bicycle_time=0.0 ):
        self.bus_time = bus_time
        self.subway_time = subway_time
        self.s_flight_time = s_flight_time
        self.l_flight_time = l_flight_time
        self.gasoline_car_time = gasoline_car_time
        self.diesel_car_time = diesel_car_time
        self.train_time = train_time
        self.electric_bicycle_time = electric_bicycle_time
        self.electric_car_time = electric_car_time

        self.Bool_trainUsed = False
        self.emission_train = 0.0
        self.emission_bus =  self.bus_time / 60.0 * emissions_data["Bus"]["speed"] * emissions_data["Bus"]["emission"]
        self.emission_subway = self.subway_time / 60.0 * emissions_data["Subway"]["speed"] * emissions_data["Subway"]["emission"]
        self.emission_s_flight =  self.s_flight_time / 60.0 * emissions_data["S_Flight"]["speed"] * emissions_data["S_Flight"]["emission"]
        self.emission_l_flight =  self.l_flight_time / 60.0 * emissions_data["L_Flight"]["speed"] * emissions_data["L_Flight"]["emission"]
        self.emission_g_car =  self.gasoline_car_time / 60.0 * emissions_data["Gasoline_Car"]["speed"] * emissions_data["Gasoline_Car"]["emission"]
        self.emission_d_car =  self.diesel_car_time / 60.0 * emissions_data["Diesel_Car"]["speed"] * emissions_data["Diesel_Car"]["emission"]
        self.emission_elec_car = self.electric_car_time / 60.0 * emissions_data["Electric_Car"]["speed"] * emissions_data["Electric_Car"]["emission"]
        self.emission_elec_bicycle = self.electric_bicycle_time / 60.0 * emissions_data["Electric_Bicycle"]["speed"] * emissions_data["Electric_Bicycle"]["emission"]

        self.emissions_co2 = 0.0
        # 초기화시에 각 이동수단별 시간을 가져온다
        if self.train_time== 0.0:
            self.Bool_trainUsed = False
        else:
            self.Bool_trainUsed = True



    global emissions_data

    def set_train_kind(self,using_train):
        if self.train_time != 0.0:
            # using_train = input("이용한 열차 : ")
            match using_train:
                case "1":
                    self.emission_train = self.train_time / 60.0 * emissions_data["Train"]["KTX"]["speed"] * emissions_data["Train"]["KTX"]["emission"]
                case "2":
                    self.emission_train = self.train_time / 60.0 * emissions_data["Train"]["KTX_Sancheon_and_Mugunghwa"]["speed"] * emissions_data["Train"]["KTX_Sancheon_and_Mugunghwa"]["emission"]
                case "3":
                    self.emission_train = self.train_time / 60.0 * emissions_data["Train"]["Nuriro_and_ITX_Cheongchun_and_ITX_Saemaeul"]["speed"] * emissions_data["Train"]["Nuriro_and_ITX_Cheongchun_and_ITX_Saemaeul"]["emission"]
                case _:
                    self.emission_train = 0.0
                    print("잘못된 값을 입력하셨습니다, 열차시간은 계산에서 제외합니다")
        else:
            print("입력된 기차가 없습니다")


    def calculate_co2(self):
        # move_bus = (25.0/60.0 * emissions_data["Bus"]["speed"])*emissions_data["Bus"]["emission"]
        self.emissions_co2 = (self.emission_bus + self.emission_subway + self.emission_s_flight +
                              self.emission_l_flight + self.emission_g_car + self.emission_d_car +
                              self.emission_elec_car + self.emission_elec_bicycle + self.emission_train)

        return round(self.emissions_co2,2)

vehicle = VehicleCo2(train_time= 30,subway_time=50,electric_car_time=40)
vehicle.set_train_kind('3')
print(vehicle.calculate_co2()) # 4611.97