이번 작업은 제가 정말 오랫동안 작업을 진행했습니다
일주일 정도 걸렸던 것 같습니다
새로운 코드들을 적용하고 하는데 시간 자체는 오래 걸리지 않았지만
이 코드들을 원하는 대로 만들고 싶기도 했고 보기 편하게 만들고 싶었기 때문에 시간이 걸린 것 같습니다
이번에는 코드 자체도 148줄로 꽤 길고 설명드려야 할 것도 많기 때문에
여러 파트로 나누어서 하겠습니다
- 코드
from hashlib import new
from tkinter import *
import tkinter.font
from tkinter import ttk
import pandas as pd
import csv
#-------------------------------------------------------------------------------------------------------------------------------------------#
atmos = Tk()
atmos.title('Meteological Observation Web ')
atmos.geometry("1440x900")
atmos.configure(bg = 'aqua')
#-------------------------------------------------------------------------------------------------------------------------------------------#
#font
font = tkinter.font.Font(family = '충북대직지체', size = 25)
font1 = tkinter.font.Font(family = '충북대직지체', size = 40)
font2 = tkinter.font.Font(family = '충북대직지체', size = 10)
font3 = tkinter.font.Font(family = '충북대직지체', size = 16)
font4 = tkinter.font.Font(family = '충북대직지체', size = 20)
#-------------------------------------------------------------------------------------------------------------------------------------------#
class toplevel6:
def __init__(self):
stn = '속초(90)', '철원(95)', '대관령(100)', '춘천(101)', '강릉(105)', '동해(106)', '원주(114)', '영월(121)', '인제(211)', '홍천(212)', '태백(216)'
year = list(range(2000, 2020+1))
toplevel1 = tkinter.Toplevel(atmos, bg = 'lavender')
toplevel1.geometry('500x400')
label3 = Label(toplevel1, text = '찾고 싶은 자료의 지점과 년도를 선택해주세요', font = font3, bg = 'lavender')
label3.place(x = 30, y = 50)
label4 = Label(toplevel1, text = '강원도 관측소 입니다', font = font4, bg = 'lavender')
label4.place(x = 35, y = 330)
self.combo1_str = StringVar()
self.location_combo1 = ttk.Combobox(toplevel1, textvariable = self.combo1_str,
font = font4)
self.location_combo1['values'] = stn
self.location_combo1.place(x = 30, y = 100)
self.combo2_str = StringVar()
self.location_combo2 = ttk.Combobox(toplevel1, textvariable = self.combo2_str,
font = font4)
self.location_combo2['values'] = year
self.location_combo2.place(x = 30, y = 150)
self.btn3 = Button(toplevel1, text = '찾기', command = self.data, font = font4)
self.btn3.place(x = 30, y = 230)
- 제작 목적과 사용한 자료들
먼저 필요한 라이브러리들 입니다
데이터 전처리를 위한 pandas, csv 파일을 입력시키기 위한 csv,
GUI 프로그래밍에 꼭 필요한 tkinter 이렇게 3가지 입니다
제가 처음에 만들려고 했던 프로그램에서는 조금 계획이 변경된 작업입니다
기존에는 기상자료개방포털에서 API 시스템을 통해 실시간으로 받아온 뒤 출력이 되게 할 예정이었지만
현재 기상자료개방포털 API 시스템이 적용이 되지 않아서 직접 자료를 받은뒤에
불러오는 식으로 변경했습니다
강원도 지역 ASOS 관측소
속초, 철원, 대관령, 춘천, 강릉, 동해, 원주, 영월, 인제, 홍천, 태백 총 11개 관측소의
2000년부터 2020년까지의 관측 자료들을 사용했습니다
파일 이름은 지역(번호)_연도.csv로 통일시켜서 저장했습니다
- 실행 시 모습
![](https://blog.kakaocdn.net/dn/bjPMWp/btrOGwc1xMo/Kbz6PjzH4DAq0MLtPTftxk/img.png)
![](https://blog.kakaocdn.net/dn/dosewa/btrOUNwN2VR/oNkk7eLse3ZxvPmMfGVAy1/img.png)
제가 보여드린 코드에 대해 실행된 모습입니다
다른 기본적인 프로그램과 많이 다르지 않게 만들려고 노력을 했습니다
코드를 하나씩 살펴보겠습니다
- 세부 코드 해석
1) 기본 틀 열기
atmos = Tk()
atmos.title('Meteological Observation Web ')
atmos.geometry("1440x900")
atmos.configure(bg = 'aqua')
이 부분은 기본 틀을 잡는 부분입니다
matplotlib로 치면 plt.figure와 비슷한 부분입니다
atmos라는 이름의 기본 틀을 만들고
이 창이 열릴때 제목은 'Meteological Observation Web'으로 설정해라 라는 뜻입니다
또 창의 크기는 1400x900의 크기로 만들겠다 입니다
컴퓨터 해상도랑 같은 단위인 pixel을 사용합니다
2) 폰트 선언
#font
font = tkinter.font.Font(family = '충북대직지체', size = 25)
font1 = tkinter.font.Font(family = '충북대직지체', size = 40)
font2 = tkinter.font.Font(family = '충북대직지체', size = 10)
font3 = tkinter.font.Font(family = '충북대직지체', size = 16)
font4 = tkinter.font.Font(family = '충북대직지체', size = 20)
프로그램들을 보시면 각 부분마다 폰트가 전부 다르기 때문에
자주 사용할 것 같은 폰트들을 변수로 만들어서 사용했습니다
3) 변수 선언
class toplevel6:
def __init__(self):
stn = '속초(90)', '철원(95)', '대관령(100)', '춘천(101)', '강릉(105)', '동해(106)', '원주(114)', '영월(121)', '인제(211)', '홍천 (212)', '태백(216)'
year = list(range(2000, 2020+1))
위에 두줄은 뒤쪽에 toplevel6을 부르는 부분에서 설명드리겠습니다
아래 두줄은 ASOS 지점 이름들과 년도를 변수로 지정했습니다
4) 창과 열린 창에 내용 작성
toplevel1 = tkinter.Toplevel(atmos, bg = 'lavender')
toplevel1.geometry('500x400')
label3 = Label(toplevel1, text = '찾고 싶은 자료의 지점과 년도를 선택해주세요', font = font3, bg = 'lavender')
label3.place(x = 30, y = 50)
label4 = Label(toplevel1, text = '강원도 관측소 입니다', font = font4, bg = 'lavender')
label4.place(x = 35, y = 330)
사진 중 첫번째 사진을 보시면 자료조회 버튼이 있습니다
저 자료조희 버튼을 누르면 작은 창이 하나 나오도록 설정을 했었습니다
이 부분이 작은 창을 만드는 부분입니다
atmos로 지정했던 첫번째 창 위에 500x400 크기, 배경 색깔은 라벤더로 만들겠다는 구문을 toplevel1에 지정한겁니다
이후에 작은 창에 무언갈 추가하고 싶으면 toplevel1에 추가를 해야합니다
label은 단순하게 글씨를 적는 겁니다
여기서 중요한게 글자 하나하나의 크기를 인식하지 않고 문장 전체를 한 개의 박스로 보기 때문에
배경색을 지정하지 않으면 흰색 부분이 생깁니다
5) 콤보 박스 만들기
self.combo1_str = StringVar()
self.location_combo1 = ttk.Combobox(toplevel1, textvariable = self.combo1_str,
font = font4)
self.location_combo1['values'] = stn
self.location_combo1.place(x = 30, y = 100)
self.combo2_str = StringVar()
self.location_combo2 = ttk.Combobox(toplevel1, textvariable = self.combo2_str,
font = font4)
self.location_combo2['values'] = year
self.location_combo2.place(x = 30, y = 150)
아래 사진처럼 화살표를 눌렀을 때 선택 가능한 항목들을 나열해주는 것을 콤보박스라고 합니다
![](https://blog.kakaocdn.net/dn/y1uBP/btrOR6RIvx9/b0AJtHlo9eC222FKFd1pvK/img.png)
![](https://blog.kakaocdn.net/dn/3Iacq/btrOUNDzAKI/xc7m01G6cP2vhRkkedMAKk/img.png)
저는 combo box에서 무언갈 선택하면 아무것도 없던 창에 선택한 항목이 남아있게 할겁니다
![](https://blog.kakaocdn.net/dn/wxFPe/btrOUMkmTH3/DRT1K6HKCBFhvSZzudqzLk/img.png)
이렇게 말이죠
먼저 아무것도 없는 빈 문자열 변수 self.combo1_str를 하나 만들겠습니다
그후 ttk.location_combo로 toplevel1에 combo box를 만들어라 라고 해주고
선택되었을 때 표시될 항목은 앞에 self.combo1_str로 하고 폰트는 font4로 하겠다라는 의미입니다
하나하나 해석해보면 그렇게 어렵지 않습니다
그리고 콤보 박스 항목에 들어갈 변수들은 list 변수인 str로 해주고 위치를 조정하면 combo box 한 개가 추가가 됩니다
저는 지점명과 연도 2개로 나누어 만들었기 때문에 콤보 박스 2개를 넣어주었구요
직접 해 보실 분들은 원하는 대로 하시면 될 것 같습니다
6) 버튼 만들기
다음은 아래 사진에 있는 찾기 버튼입니다
![](https://blog.kakaocdn.net/dn/czLUcT/btrORYmjU2E/QohPxDYky51s4BybI2dBKk/img.png)
처음 사진을 보시면 자료 조회라는 버튼도 있지만 연결된 커맨드가 있기 때문에 뒤쪽에서 설명하겠습니다
self.btn3 = Button(toplevel1, text = '찾기', command = self.data, font = font4)
self.btn3.place(x = 30, y = 230)
버튼은 진짜 간단합니다
다시 해석해보면 버튼을 만드는 데 toplevel1에 만들겠다
버튼에 적힐 텍스트는 '찾기'라는 글자고 font4로 하겠다
이 다음 중요한게 command 입니다
버튼이 아무리 눌러도 아무것도 안되면 쓸모없겠죠?
그래서 버튼을 눌렀을 때 어떤 행동을 할지 정하는 명령어가 command 입니다
제가 설정한 command, self.data는 다음 포스팅에서 설명드릴
진짜로 이제 값을 출력하는 화면을 보여주는 명령어들이 들어 있습니다
자 그럼 여기서 중요한거 그럼 자료 조회 버튼을 누르면 무슨 일이 일어날까요?
toplevel1이 출력이 되야 지점도 고르고 년도도 고르고 조회를 누르겠져??
btn1 = Button(atmos, text = '자료 조회', width = 10, height = 2, font = font1,
bg = 'indigo', fg = 'white', command = toplevel6)
btn1.place(x = 550, y = 150)
그 코드가 이 코드입니다
아까 클래스를 뒤쪽에서 설명드린다고 했는데
제가 지금까지 설명한 모든 부분이 한 class로 묶여 있고 이 클래스의 이름이 toplevel6입니다
그러면 버튼을 눌렀을 때 실행되는 일들이 command에 들어간다고 설명드렸죠?
이 모든 과정들이 toplevel6이기 때문에 자료 조회 버튼을 누르면
toplevel1이라는 작은 창과 toplevel1 안에 콤보박스와 텍스트, 찾기 버튼을 출력하게 되는 것입니다
tkinter라는 라이브러리는 크게 어렵지는 않습니다
Python tkinter 강좌 : 제 1강 - GUI 생성
tkinter
076923.github.io
저는 이 분의 깃허브를 보고 배웠습니다
조금 더 빨리 하고 싶으신 분들은 여기 들어가서 하나씩 보시면 될 것 같습니다
연결되는 게 좋을거 같아서 한 번에 다 포스팅을 해보려고 했는데
아무래도 코드도 길고 GUI 프로그래밍이라 사진으로 보여드리면서 하다보니 여러 파트로 끊게 된 것 같습니다
다음 포스팅에는 찾기 버튼을 누르면 나오는 화면에 대해서 마저 다루겠습니다
'파이썬' 카테고리의 다른 글
작업8 : Fortran으로 만든 자료 시각화 (0) | 2022.10.26 |
---|---|
작업7 : Python을 통한 GUI 프로그래밍2 (0) | 2022.10.18 |
작업 5 : density를 통해 히스토그램 성질 증명해보기 (0) | 2022.04.09 |
작업 4 : 표준 정규 분포 그려보기 (0) | 2022.04.08 |
작업 2 : Folium으로 울진 산불 지도에 표시해보기 (0) | 2022.03.22 |