23.03.15 Day32

오윤범·2023년 3월 15일
0
post-custom-banner

Thread 앱

  • Qt Designer로 ui 생성
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import * 
import time

MAX=1000

class BackgroundWorker(QThread): #PyQt5 스레드를 위한 클래스 존재
    procChanged = pyqtSignal(int) # 커스텀 시그널 / Click같은 시그널을 사용자가 만드는것

    def __init__(self,count=0,parent=None)->None:
        super().__init__()
        self.main=parent
        self.working=False #스레드 동작여부 확인하는 변수
        self.count=count

    def run(self): # thread.start() 할 때 run이 돌아감
        while self.working:
            if self.count<=MAX:
                self.procChanged.emit(self.count) # self.count값을 호출한곳으로 내보냄(ex.procUpdated)
                self.count+=1 # 값 증가 처리만 함 // 업무프로세스 동작 위치
                time.sleep(0.001) # 0.00000001 정도로 주면 GUI처리를 제대로 못함
            else:
                self.working=False # MAX 값 넘어가면 False로 바뀌면서 while문 탈출

class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyThread/threadApp.ui',self) #Qt Designer로 만든 ui 사용
        self.setWindowTitle('Thread 앱')
        self.pgbTask.setValue(0)

        self.btnStart.clicked.connect(self.btnStartClicked)
        # 스레드 초기화
        self.worker=BackgroundWorker(parent=self, count=0)
        # 백그라운드 worker의 시그널에 접근하여 처리하기 위한 슬롯 함수
        self.worker.procChanged.connect(self.procUpdated)

        self.pgbTask.setRange(0,MAX) #0~1000으로 범위설정

    def procUpdated(self,count):
        self.txbLog.append(f'스레드 출력 > {count}')
        self.pgbTask.setValue(count)
        print(f'스레드 출력 > {count}')

    def btnStartClicked(self):
        self.worker.start() # QThread 클래스 내부의 run() 실행
        self.worker.working = True
        self.worker.count=0 # 지정 범위 종료 후 스레드시작 버튼 다시 클릭 시 동작함

if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=qtApp()
    ex.show()
    sys.exit(app.exec_())

이메일 보내기 APP

# 이메일 보내기 앱
import smtplib # 메일 전송 프로토콜 
from email.mime.text import MIMEText

send_email='@naver.com' #실제 구동 시 제대로된 이메일 작성
send_pass='!!' # 실제 구동 시 해당 이메일의 실제 패스워드 작성

recv_email='@naver.com' #실제 구동 시 제대로된 이메일 작성

smtp_name='smtp.naver.com'
smtp_port = 587 # 포트번호 정해져있음

text = '''메일 내용
긴급 빨리 연락바람'''

msg=MIMEText(text)
msg['Subject'] = '메일 제목입니다'
msg['From'] = send_email # 보내는 메일
msg['To'] = recv_email # 받는 메일

#print(msg.as_string())

mail=smtplib.SMTP(smtp_name,smtp_port) # SMTP 객체생성
mail.starttls() #전송계층 보안시작
mail.login(send_email,send_pass)
mail.sendmail(send_email,recv_email,msg=msg.as_string())
mail.quit()
print('전송완료!')
  • send_email / send_pass / recv_email 설정하여
  • 송신자 : send_email / 수신자 : recv_email 로 메일 전송 가능

이미지에서 글자 추출(Tesseract-OCR 사용)

  • 글자 추출에 사용하는 이미지들



# 글자추출
# 이미지 처리 모듈 pip install pillow
# OCR 모듈 pip install pytesseract
# Tesseract-OCR 컴퓨터 설치
# https://github.com/tesseract-ocr/tessdata/blob/main/kor.traineddata 
# 위 링크에서 kor.traineddata 다운로드 후 C:\DEV\Tools\Tesseract-OCR\tessdata <- 경로에 붙여넣기
from PIL import Image
import pytesseract as tess

img_path='./Python_practice/한글이미지.png'
tess.pytesseract.tesseract_cmd = 'C:/DEV/Tools/Tesseract-OCR/tesseract.exe'

result = tess.image_to_string(Image.open(img_path), lang='kor')
print(result)

  • 완벽하진 않지만 다음과 같이 이미지에서 글자가 추출 되는것을 확인
post-custom-banner

0개의 댓글