파이썬

작업7 : Python을 통한 GUI 프로그래밍2

이석사 중 2022. 10. 18. 01:23
728x90

저번 GUI 프로그래밍1에 이어서 2도 포스팅해보겠습니다

오늘 설명드릴 부분의 코드입니다

오늘 부분은 전체적인 내용은 1편에 있던 찾기 버튼을 눌렀을 때

이제 저희가 보고 싶은 자료가 나와야 하겠죠?

그 부분을 만들어준겁니다

def data(self):
        getdata1 = self.location_combo1.get()
        getdata2 = self.location_combo2.get()
        print(getdata1, getdata2)
            
        stn = '속초(90)', '철원(95)', '대관령(100)', '춘천(101)', '강릉(105)', '동해(106)', '원주(114)', '영월(121)', '인제(211)', '홍천(212)', '태백(216)'
    
        year = list(range(2000, 2020+1))
        
        for i in stn:
            for j in year:
                if getdata1 == '{}'.format(i):
                    if getdata2 == '{}'.format(j):
                        toplevel2 = tkinter.Toplevel(atmos)
                        toplevel2.geometry('1600x900')
    
                        filepath = 'F:\python\set\{}_{}.csv'.format(i, j)
    
                        data = pd.read_csv(filepath, encoding = 'euc-kr')
                                               
                        pd.set_option('display.max_row', 500)
                        #pd.set_option('display.max_columns', 10)
    
                        Data = pd.DataFrame(data)
                        
                        nb= tkinter.ttk.Notebook(toplevel2)
                        nb.pack()
                        
                        col1 = ['지점', '일시', '평균기온(°C)', '최저기온(°C)', '최고기온(°C)']
                        col2 = ['지점', '일시', '일강수량(mm)','10분 최다 강수량(mm)', '1시간 최다강수량(mm)']
                        col3 = ['지점', '일시', '평균 풍속(m/s)', '최대 순간 풍속(m/s)', '최대 순간 풍속 풍향(16방위)', '최대 풍속 풍향(16방위)']
                        col4 = ['지점', '일시', '평균 상대습도(%)', '최소 상대습도(%)', '평균 현지기압(hPa)', '평균 해면기압(hPa)', '최고 해면기압(hPa)', '최저 해면기압(hPa)']
                        
#-------------------------------------------------------------------------------------------------------------------------------------------#                       
                        frame1 = tkinter.Frame(toplevel2)
                        nb.add(frame1, text = '기온')
                        
                        txt1 = Text(frame1, width = 210, height = 70, font = font3)
                        txt1.pack()
                        txt1.insert(END, Data[['지점', '일시', '평균기온(°C)', '최저기온(°C)', '최고기온(°C)']])
 

 

  • 세부 코드 설명

1) 콤보 박스의 값 받아오기

def data(self):
        getdata1 = self.location_combo1.get()
        getdata2 = self.location_combo2.get()
        print(getdata1, getdata2)

먼저 첫번째 부분입니다

저희가 1편에서 toplevel1에 콤보 박스를 넣었었져

이 부분은 어렵지 않게 콤보 박스의 값을 받아오는 부분입니다

사용자가 선택한 값을 getdata1, getadat2라는 변수로 받아오는 겁니다

print 부분은 프로그램 상에서 출력되지 않습니다

vscode에서 내가 선택한 값이 정상적으로 받아졌나 확인차 넣은 부분이니 안 넣으셔도 전혀 문제는 없습니다

2) 새로운 창 만들기

        stn = '속초(90)', '철원(95)', '대관령(100)', '춘천(101)', '강릉(105)', '동해(106)', '원주(114)', '영월(121)', '인제(211)', '홍천(212)', '태백(216)'
    
        year = list(range(2000, 2020+1))
        
        for i in stn:
            for j in year:
                if getdata1 == '{}'.format(i):
                    if getdata2 == '{}'.format(j):
                        toplevel2 = tkinter.Toplevel(atmos)
                        toplevel2.geometry('1600x900')
    
                        filepath = 'F:\python\set\{}_{}.csv'.format(i, j)
    
                        data = pd.read_csv(filepath, encoding = 'euc-kr')
                                               
                        pd.set_option('display.max_row', 500)
                        #pd.set_option('display.max_columns', 10)
    
                        Data = pd.DataFrame(data)

다음은 자료를 출력해줄 새로운 창을 만들겠습니다

저는 클린코드보다는 아직은 정확한 출력을 더 원하기 때문에 위쪽에 stn과 year 변수가 있지만 한 번 더 선언해주었습니다

먼저 i와 j에 stn과 year을 반복문으로 집어 넣어주겠습니다

그 다음으로 if문을 통해 입력받은 값이 i와 j에 있을 때

'F:\python\set\{}_{}.csv'.format(i, j) format문을 사용해서 이 값들을 파일 경로에 넣어주는 겁니다

쉽게 얘기해서

값을 입력받는다 -> 이 값이 i와 j 중에 있다 -> 이 값을 filepath 변수에 집어 넣는다

이런 방식입니다

toplevel2는 감이 오시죠?

새로운 창을 하나 더 열어준 겁니다

모든 파일들이 csv 형식이기 때문에 dataframe 형태로 바꿔주겠습니다

3) 자료가 작성될 도화지 만들어주기

                        nb= tkinter.ttk.Notebook(toplevel2)
                        nb.pack()

nb는 notebook의 줄임말로 자료가 작성될 공간을 만들어주는 겁니다

다른 프로그램들을 보다보면 이렇게 페이지를 나눠놓은 프로그램들이 있습니다

notebook을 통해 하나하나 공간을 나누어주고 이 공간에 작성하고 싶은 자료만 따로 써지도록 하는 겁니다

여기서 중요한 점은 저희가 만든 오브젝트들이 프로그램 상에 출력이 되게 하기 위해서는

항상 pack()을 해주어야 합니다

text면 text.pack(), notebook이면 nb.pack() . 앞에는 변수명이니 유의하시면 될 것 같습니다

꼭 명심하세요! pack()을 하지 않으면 만들어도 출력이 되지 않아요!

4) Notebook별 자료 나눠 작성하기

                        frame1 = tkinter.Frame(toplevel2)
                        nb.add(frame1, text = '기온')
                        
                        txt1 = Text(frame1, width = 210, height = 70, font = font3)
                        txt1.pack()
                        txt1.insert(END, Data[['지점', '일시', '평균기온(°C)', '최저기온(°C)', '최고기온(°C)']])

중간에 col1 이런거는 제가 어떻게 나눠야 할까 하면서 써놓은거라 넘아가셔도 됩니다

저는 4개로 되어 있기 때문에 위에와 같은 코드가 4개가 필요합니다

현재는 4번 반복해놓은 상태이지만 중간고사 끝나고 시간이 되면 def로도 만들어서 포스팅 해보겠습니다

먼저 frame은 tkinter내에 존재하는 다른 기능들을 추가할 수 있는 공간을 말합니다

기능이면 버튼도 가능하구요 사진이나 저 안에 노트북이 또 들어가거나 할 수 있습니다

아까 새로 만든 창인 toplevel2에 프레임을 만들어주구여

nb.add로 '기온'이라는 공간을 만들고 이 안에 frame1을 불러오겠다는 말입니다

txt1이라는 변수에 저희가 작성할 자료를 text method를 통해 할당해주겠습니다

지금은 아무것도 없이 text의 위치와 폰트 정도만 정했기 때문에 이제 값을 집어넣어주면 됩니다

기온이니까 Data에서 기온과 관련된 자료들만 보이게 하면 되겠죠?

Data에서 지점, 일시, 평균기온, 최고기온, 최저기온만 뽑아서 txt 변수에 넣겠다는 말입니다

이정도면 자료를 출력해주는 창 설정은 모두 끝났습니다

이제 진짜 마지막 코드로 가보겠습니다

5) 핵심!, mainloop

label1 = Label(atmos,
               text = 'ASOS는 종관 규모의 날씨를 파악하기 위하여 정해진 시각에 모든 관측소에서 실시하는 지상관측을 말한다.',
                padx = 10, pady = 10, font = font, bg = 'aqua', fg = 'black', wraplength = 1000)
label1.place(x = 250, y = 400)

label2 = Label(atmos,
               text = '주로 기상관서에 설치되고 전국 10개소에서 그 지역의 현재 기상 실시간 제공 및 기상예보에 활용하고 있다. 종관규모는 일기도에 표현되어 있는 보통의 고기압이나 저기압의 공간적 크기 및 수명을 말하며, 주로 매일의 날씨 현상을 뜻합니다.',
               padx = 10, pady = 10, font = font, bg = 'aqua', fg = 'black', wraplength = 1000)
label2.place(x = 230, y = 600)

atmos.mainloop()

여기 코드는 맨 마지막 줄만 설명드리면 될 것 같습니다

위에 label은 글씨 작성이기 때문에 넘어가도 될 거라고 생각합니다

GUI 프로그램에서 중요한 점은 프로그램이 계속 실행이 되어있어야 한다는 점 입니다

단순히 계산처럼 값만 출력하고 꺼져버리면 안된다는 거죠

그렇게 때문에 이 프로그램 자체를 loop, 즉 반복시키겠다는 거죠

계속 반복시켜서 사용자가 끄지 않는한 계속 켜져있도록 하는거죠

이 부분을 치지 않으면 켜지자 마자 꺼지게 됩니다

계산기 처럼 잠깐 출력하고 바로 종료가 되는거죠

저도 아직 공부해나가는 단계이기 때문에 설명을 잘 드렸는지는 잘 모르겠습니다

저 나름대로 이해하고 공부한 점을 다른 분들도 해보셨으면 하는 마음에

코드와 함께 설명을 드리는데 도움이 되었으면 좋겠습니다

https://076923.github.io/posts/Python-tkinter-1/

tkinter에 관심이 있으신 분들은 꼭 이 페이지를 추천드립니다

생각보다 제가 원하는 대로 출력도 되지 않았지만

코드를 계속 보완해나가면서 업그레이드 시킬 수 있도록 해보겠습니다

이렇게 재밌는 라이브러리를 또 찾게 된다면 이런 프로젝트도 많이 해보겠습니다

감사합니다!

728x90