본문 바로가기
카테고리 없음

tkinter & thread

by eplus 2024. 10. 29.

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 = threading.Thread(target=getHtml, args=('http://google.com',))
    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호출을 쓰레드를 예외로 호출합니다.
  • 파이썬
    코드모사
    def main(): t1 = threading.Thread(target=getHtml, args=('http://google.com',)) t1.start()

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를 계속 실행하도록 합니다.

주요 기능 요약

  1. 버튼 제어 : 두 개의 버튼("종료", "START")이 오류 "종료"는 프로그램을 종료하고, "START"는 HTTP 요청을 보냅니다.
  2. HTTP 요청 : requests모듈을 Google 홈페이지에 요청을 보냅니다.
  3. 쓰레드 사용 : getHtml인증은 쓰레드를 통해 요청을 처리합니다. 이로 인해 GUI가 작동하지 않을 수 있습니다.
  4. : HTTP 요청 결과를리스트 박스 에표시하며, 10개의 디버그 항목이 쌓여있어 버려진 항목을 삭제합니다.

개선 사항

  1. 참고 처리 : requests.get()예외가 발생한 경우를 대비하여 try-except추가로 처리하는 것이 좋습니다.
  2. UI 개선 : 목록박스 항목이 멋진 경우 스크롤 기능을 추가하거나, 더 많은 디자인으로 UI를 개선할 수 있습니다.
  3. 코드 정리 : 일부 UI 요소의 배치 및 스타일링을 개선하고 구조 코드를 더 모듈화하면 유지 보수성이 좋게 될 것입니다.
  4. 공룡 사용 : threading대신 asyncio나를 concurrent.futures사용하여 어린이의 소속을 변경할 수 있습니다.

이러한 개선을 통해 프로그램의 익명과 사용자 환경을 더 많이 이용할 수 있습니다.

728x90
반응형