SAMPLE 프로그램
##########################################
# eIOT - IF Main
# Date : 2023.5.4 By: EPLUS
##########################################
import tkinter
from datetime import datetime
import time
import threading
import requests
# window (GUI 생성)
window = tkinter.Tk()
ver = "1.01"
window.title("eIOT_Main_"+ver)
window.geometry("760x290+1+1") # 폭 x 높이 x Top x Left
window.resizable(False, False)
# 함수 정의 ---
# --------------------------------
def cmdClose():
quit()
def displayMsg(smsg):
now = datetime.now()
snow = now.strftime('%H:%M:%S')
icnt = listbox.size()
if icnt==10:
listbox.delete(0,0)
listbox.insert(icnt, snow+" >> "+smsg)
listbox.pack(side="left")
def getHtml(url):
resp = requests.get(url)
time.sleep(1)
displayMsg(url + ':' + str(len(resp.text)) + 'chars')
def main():
t1.start()
# Frame
frame = tkinter.Frame(window, relief="solid", bg="white", bd=1)
frame.pack(side="top", fill="x", expand=False)
frameB = tkinter.Frame(window, relief="solid", bg="yellow", bd=0)
frameB.pack(side="bottom", fill="x", expand=False)
# Button
button = tkinter.Button(frame, overrelief="solid", width=10, relief="raised", font="굴림체", height=1, command=cmdClose, text="종료" )
button.pack(side="right")
buttonS = tkinter.Button(frame, overrelief="solid", width=10, relief="raised", font="굴림체", height=1, command=main, text="START" )
buttonS.pack(side="right")
# ListBox
listbox = tkinter.Listbox(window, selectmode='extended', font="굴림체", fg="white", bg="black", bd=1, width=760)
now = datetime.now()
snow = now.strftime('%Y-%m-%d %H:%M:%S')
sdate = now.strftime('%Y-%m-%d')
# Label
label = tkinter.Label(frame, text="일자 : "+sdate, width=20, height=1, bg="white", font="굴림체", relief="flat" )
label.pack(side="left")
labelM = tkinter.Label(frameB, text=snow, width=200, height=2, bg="yellow", relief="solid" )
labelM.pack(side="left")
window.mainloop()
ChatGPT가 분석한 내용
이 코드는 Python의 tkinter라이브러리를 사용하여 GUI(그래픽 사용자 인터페이스)를 만드는 간단한 프로그램입니다. 이 프로그램은 HTTP 요청을 기록하는 기능을 목록에 표시하는 기능을 포함합니다. 주요 기능 및 코드 분석은 다음과 같습니다.
코드분석
1. 모듈 임포트 및 기본 설정
파이썬
코드모사
import tkinter from datetime import datetime import time import threading import requests
- tkinter: GUI 생성을 위해 사용합니다.
- datetime: 현재 시간을 가져오기 위해 사용됩니다.
- time, threading: 쓰레드를 유일하게 요청할 때 사용하게 됩니다.
- requests: HTTP 요청을 보내는 데 사용됩니다.
2. 컨트롤러 생성 및 설정
파이썬
코드모사
window = tkinter.Tk() ver = "1.01" window.title("eIOT_Main_" + ver) window.geometry("760x290+1+1") # 폭 x 높이 x Top x Left window.resizable(False, False)
- window = tkinter.Tk(): Tk를 생성하여 메인을 생성합니다.
- window.title(...), window.geometry(...): 흥미로운 제목과 크기를 설정합니다.
- window.resizable(False, False): 크기를 변경하지 말고 설정하세요.
3. 작동 정의
- cmdClose(): 프로그램 종료 버튼이 실행됩니다.
-
파이썬코드모사def cmdClose(): quit()
- displayMsg(smsg):리스트에 메시지를 표시하는 함수입니다.
-
파이썬코드모사def displayMsg(smsg): now = datetime.now() snow = now.strftime('%H:%M:%S') icnt = listbox.size() if icnt == 10: listbox.delete(0, 0) # 리스트박스 항목이 10개가 되면 가장 오래된 항목을 삭제합니다. listbox.insert(icnt, snow + " >> " + smsg) listbox.pack(side="left")
- getHtml(url): HTTP GET 요청을 응답 크기를 리스트박스에 출력하는 것입니다.
-
파이썬코드모사def getHtml(url): resp = requests.get(url) time.sleep(1) displayMsg(url + ':' + str(len(resp.text)) + 'chars')
- main(): getHtml호출을 쓰레드를 예외로 호출합니다.
-
파이썬코드모사
4. 프레임워크 생성
- 프레임 설정프레임은 GUI 요소를 그룹화하기 위해 사용됩니다.
-
파이썬코드모사frame = tkinter.Frame(window, relief="solid", bg="white", bd=1) frame.pack(side="top", fill="x", expand=False) frameB = tkinter.Frame(window, relief="solid", bg="yellow", bd=0) frameB.pack(side="bottom", fill="x", expand=False)
- 버튼 생성 및 배치
- "종료" 버튼이 cmdClose종료됩니다.
- "START" 버튼이 main호출 getHtml을 요청하여 시작됩니다.
-
파이썬코드모사button = tkinter.Button(frame, overrelief="solid", width=10, relief="raised", font="굴림체", height=1, command=cmdClose, text="종료") button.pack(side="right") buttonS = tkinter.Button(frame, overrelief="solid", width=10, relief="raised", font="굴림체", height=1, command=main, text="START") buttonS.pack(side="right")
- 리턴박스 생성리스트박스는 HTTP 요청 출력과 메시지를 표시하는 데 사용됩니다.
-
파이썬코드모사listbox = tkinter.Listbox(window, selectmode='extended', font="굴림체", fg="white", bg="black", bd=1, width=760)
- 이름 생성 및 배치표시는 현재 날짜와 시간을 GUI에 표시합니다.
-
파이썬코드모사now = datetime.now() snow = now.strftime('%Y-%m-%d %H:%M:%S') sdate = now.strftime('%Y-%m-%d') label = tkinter.Label(frame, text="일자 : " + sdate, width=20, height=1, bg="white", font="굴림체", relief="flat") label.pack(side="left") labelM = tkinter.Label(frameB, text=snow, width=200, height=2, bg="yellow", relief="solid") labelM.pack(side="left")
5. 메인 루프 작업
파이썬
코드모사
window.mainloop()
window.mainloop()Tk 인터페이스에서 이벤트를 처리하고 GUI를 계속 실행하도록 합니다.
주요 기능 요약
- 버튼 제어 : 두 개의 버튼("종료", "START")이 오류 "종료"는 프로그램을 종료하고, "START"는 HTTP 요청을 보냅니다.
- HTTP 요청 : requests모듈을 Google 홈페이지에 요청을 보냅니다.
- 쓰레드 사용 : getHtml인증은 쓰레드를 통해 요청을 처리합니다. 이로 인해 GUI가 작동하지 않을 수 있습니다.
- : HTTP 요청 결과를리스트 박스 에표시하며, 10개의 디버그 항목이 쌓여있어 버려진 항목을 삭제합니다.
개선 사항
- 참고 처리 : requests.get()예외가 발생한 경우를 대비하여 try-except추가로 처리하는 것이 좋습니다.
- UI 개선 : 목록박스 항목이 멋진 경우 스크롤 기능을 추가하거나, 더 많은 디자인으로 UI를 개선할 수 있습니다.
- 코드 정리 : 일부 UI 요소의 배치 및 스타일링을 개선하고 구조 코드를 더 모듈화하면 유지 보수성이 좋게 될 것입니다.
- 공룡 사용 : threading대신 asyncio나를 concurrent.futures사용하여 어린이의 소속을 변경할 수 있습니다.
이러한 개선을 통해 프로그램의 익명과 사용자 환경을 더 많이 이용할 수 있습니다.
728x90
반응형