Matplotlib 실시간 차트 그리기

이미지
이번 시간에는 matplotlib 를 이용해 실시간 챠트 (FuncAnimation이용)를 구성하는 방법과 해당 챠트를 PyQt5와 연동하는 방법에 대해 소개합니다. sin 파 FuncAnimation Class를 이용해 실시간으로 그리기 [matplotlib + PyQt5 + FuncAnimation] 인터넷에 matplotlib를 이용해 챠트를 그리는 방법은 많이 소개되어 있지만, 실시간 챠트 예제는 자료가 거의 없어 직접 만들어 보았습니다.  Pyinstaller로 제작한 실행파일 : chart matplotlib 예시 matplotlib는 데이터를 여러 종류 챠트를 구성하고, 보기좋게 그래프로 시각화 시키는 파이 썬 패키지 입니다. 소스코드 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg import numpy as np QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) class CWidget(QWidget): def __init__(self): super().__init__() # for PyQt embedding self.fig = plt.Figure() self.canvas = Figure...

포트리스 게임의 포물선 운동 구현하기

이미지
대학 시절 " 포트리스 "라는 게임이 있었습니다. 포탄이 날아가는 속도와 각도를 조절해 상대를 맞추는 게임인데, 비슷하게 파이썬으로 구현해 보았습니다. 실제 게임의 요소(적군, 충돌, 바람)는 코드 간단화를 위해 구현하지 않았습니다, 이 글을 참조해 여러분이 직접 한번 코드로 작성해 보면 좋겠습니다. 개요 Python, PyQt5 를 이용한 간단 게임 탱크에서 발사되는 포탄에 포물선 운동 을 적용 Widget, Game, Tank, Bullet 4개의 class를 이용한 객체지향적 설계  [실행화면] 설계 방향 키보드 좌우 (탱크 이동), 상하(포탑 각도) 처리  스페이스 키 눌러짐(탄환 속도 증가), 키 업(탄환 발사) 4개의 클래스로 구성 ( CWidget :배경, CGame :게임 관리, CTank :탱크, CBullet :포탄) Draw, Keyboard Event 처리는 CWidget이 CGame에 위임 CTank는 직사각형으로 그려지고, 대포, 포탄들, 각도, 발사속도를 가짐 CBullet은 하나의 포탄을 의미하는 클래스, 위치, 속도, 각도, 착탄 여부를 가짐 CTank 는 CBullet type 객체를 리스트로 저장 (발사 포탄은 다수이기 때문) 발사된 포탄(CBullet)은 스스로 자신의 위치를 갱신 (포물선 운동) 발사된 포탄의 좌표가 윈도우 바닥 Y 좌표보다 크면 착탄이므로 삭제 소스 코드 총 3개의 파일로 구성 (main.py, game.py, tank.py) main.py (main 함수, CWidget class) game.py (CGame class...

파이썬으로 IMAP 이메일 수신 구현하기

이미지
일반적으로 우리는 E-Mail을 확인 할 때,  이메일 사이트에 접속해 로그인 후 메일을 보내고, 수신된 메일을 확인, 삭제하는 등의 방법으로 이메일을 관리합니다. 좀 더 편리하게 MS 아웃룩 등으로 메일 서버의 주소를 등록하고 관리하기도 하죠. 오늘은 파이썬을 이용해 메일서버에 접속 후 메일 수신 처리 를 진행해 보겠습니다. [파이썬으로 E-Mail 수신] 앞서 SMTP를 이용해 이메일을 파이썬으로 보내는 방법 에 대한 포스팅에 이어 이번에는 메일 수신에 대해 살펴보겠습니다. 이메일 수신과 관련해 2가지 기술적인 방법이 존재합니다. 바로 오늘 소개할 IMAP ( I nternet M essage A ccess P rotocol) 과 POP ( P ost O ffice P rotocol) 입니다. IMAP 이메일 수신 시 해당 장치에 다운로드하는 방식이 아닌 메일서버에서 읽음. 따라서 모든 장치에서 메일 확인 가능. (컴퓨터, 휴대폰, 테블릿 등) 이메일 확인 시 첨부파일 자동 다운로드 X. (빠름)  POP 메일서버에 접속해 새 이메일을 다운로드. 송, 수신 이메일은 접속한 장치, 로컬에 저장. 요즘은 IMAP을 더 많이 쓰는 추세인 것 같습니다. 그럼 파이썬으로 구글 메일서버의 IMAP을 이용한 메일 수신 방법을 살펴보겠습니다. 사전 준비 먼저 아래 그림과 같이 GMail 메일서버에 접속해 IMAP 기능 사용을 활성화 합니다. 다른 메일 서버(네이버, 다음 등) 도 마찬가지로 IMAP을 활성화 시켜야 합니다. 더불어 구글의 2단계 인증 및 인증 패스워드 도 필요합니다. 자세한 내용은 앞선 게시물인 메일 보내기 참조 바랍니다. 소스코드 일단 파이썬 코드를 살펴보겠습니다. import imapli...

MFC 기반의 Excel Automation(자동화) 예제

이미지
엑셀 오토메이션 (자동화) 개인적으로 사용해 본  소프트웨어 중 가장 잘 만들었다고 생각되는것을 하나만 꼽으라면 단연 엑셀 입니다. 문서의 작성 이나, 자료 처리 , 통계 , 수식 계산 등 다양한 분야에 활용되고 있으며, 오피스 제품군 중 독보적 존재감이라 생각합니다. 이번 시간에는 C++ 과 MFC를 이용해 엑셀파일을 제어 하는 방법에 대해 살펴보겠습니다. 파이썬에서는 openpyxl 등 모듈을 통해 쉽게 핸들링 가능하지만, C++은 코드로 구현하기가 보다 원초적이며, 어렵습니다. 약 15년 쯤 전에 C++, MFC를 이용해 탈질설비의 주요 요소(Factors, 약 30가지)를 입력받아 엑셀로 설계 출력값 (장비 치수, 허용치, 소요 자재량 등)을 일괄 계산해 주는 소프트웨어를 만든 기억이 납니다. 바로 살펴보도록 하겠습니다. 아래 코드는 Windows 10, Visual Studio 2017, Office 2016 환경에서 제작되었습니다. 프로젝트 생성 1. VS 실행, 프로젝트 생성, 대화상자 프로젝트 생성 2. 고급기능 탭, 자동화 체크, 마침 3. 프로젝트 생성 후 솔루션 탐색기, 프로젝트 우클릭, 추가, 새항목 4. MFC 탭, TypeLib MFC 클래스 선택 5. TypeLib 추가, 파일 선택, 위치 열기(아이콘) 예전에 작업할때는 레지스트리에 등록된 'Microsoft Excel xx.0 Object Library' 가 보였는데, 오피스 버전(2016) 때문인지 VS 2017 때문인지 이젠 보이지 않습니다. 파일로 설정하고 오피스가 설치된 경로로 가서 직접 Excel.exe를 선택해 필요한 클래스 인터페이스를 추가해 보겠습니다. 6. Excel 설치 경로로 이동, Excel.exe 선택 7. 인터페이스 선택 창에서 필요한 것 선택 예제에 사용된 인터페이스 목록 _Applica...

파이썬으로 SMTP 이메일 보내기

이미지
파이썬으로 메일 보내기 ( S imple M ail T ransfer P rotocol) SMTP는 인터넷으로 이메일을 보낼때 사용하는 프로토콜(약속) TCP 포트 번호는 25번을 사용 준비 작업 (Gmail 사용) 구글 계정 설정 보안, 2단계 인증 앱 비밀번호 생성 (대상 앱 : 메일, 기기 : windows 컴퓨터)  Python 코드에서 앱 비밀번호를 이용한 로그인 예정 파이썬 코드 import smtplib from email.mime.text import MIMEText # 세션 생성 s = smtplib.SMTP('smtp.gmail.com', 587) # TLS 보안 시작 s.starttls() # 로그인 인증 s.login('xxx@gmail.com', '16자리앱비밀번호') # 보낼 메시지 설정 msg = MIMEText('내용 : 한글 내용') msg['Subject'] = '제목 : 오션 코딩 학원' # 메일 보내기 s.sendmail('sender@gmail.com', 'recevier@gmail.com', msg.as_string()) # 세션 종료 s.quit() 코드 분석  1~2번 라인에서 smtplib 및 MIMEText 모듈을 불러옵니다. 파이썬은 언어 자체적(built-in) 으로 SMTP를 지원 하는 모듈이 있습니다. 5번 라인에서 세션을 만듭니다. smtplib 모듈의 SMTP class 를 생성하고 생성자 함수 전달인자로 smtp server 주소와 포트번호를 입력합니다. 직접 SMTP Class 내부를 살펴보진 않았지만 SMTP class는 TCP Socket을 생성 할 것이고,  해당 SMTP 프로토콜과 관련된 데이터를 송수신 하는 역할을 담당합니다. 8번 라인은 s.starttls...

CMFCPropertyGridCtrl에 대한 정리

이미지
저는 C++로 GUI를 구현할 때 MFC ( M icrosoft F oundation C lass)를 자주 사용합니다. MFC는 MS가 windows API 함수 들을 Wapper class형태로 구현해 놓은 것을 뜻합니다. 처음 프로그래밍을 배우던 시절 Visual Studio 6.0 을 사용하면서 습관화 되어 MFC가 익숙하지만 요즘은 Qt를 더 자주 사용하게 됩니다. 무료라는 점도 MFC를 더 자주 사용했던 이유중에 하나입니다. 입력값이 많은 프로그램 개발 시 문제 MFC를 사용하며 느끼는 불편함은 여러 가지지만, 특히 규모가 큰 프로젝트 진행 시 입,출력 값이 많다면 CEdit 컨트롤 을 너무 많이 생성해야 하는 불편함이 존재합니다. 대화상자 편집기에서 직접 컨트롤을 배치하든, 소스코드에서 동적 할당해 사용하든 상관없이 말이죠. [복잡한 입력값 처리 예시] 하나의 대화상자에 배치할 컨트롤이 너무 많아도 보기 싫고, 그렇다고 대화상자를 여러개 만들어도 사용하기가 불편합니다. 물론, DB or 파일에서 데이터를 읽어들여 사용하는 방법도 있겠으나, 가능하면 다양한 설정치를 소프트웨어에서 사용자가 쉽게 변경하고 변경치를 즉시 확인해가며 진행하는 방식 (예를 들면 시뮬레이션 분야 등) 에서는 답이 없습니다. 복잡한 UI 대안은? 이런 경우 MFC의 좋은 대안이 있습니다. Visual Studio 2008 부터 (Feature Pack 설치 시) 지원되는 (이후 버전부터 기본적으로 지원) CMFCPropertyGridCtrl 가 그 주인공입니다. 화면이 친숙한데, Visual Studio에 속성창으로 자주 사용되는 컨트롤 입니다.   [CMFCPropertyGridCtrl cl...

OpenCV기반의 얼굴, 눈 인식 앱 제작

이미지
대학교 졸업 후 DVR (Digital Video Recorder) 을 프로그래밍할 기회가 있었습니다. DVR은 쉽게 다수의 CCTV 카메라 영상을 녹화해 저장하는 장치입니다. 제가 만든 제품이 부산 사직야구장에 설치되었으며, 현재는 시간이 오래되어 아마 다른 제품이 설치되어 있을 것입니다. 당시, 녹화용량을 줄이기 위해 동영상의 정지 영상을 한 프레임씩 가져와 이전 프레임과 비교해 픽셀의 변화가 있는 경우 (움직임 감지) 저장하는 방식으로 구현했던 기억이 납니다. 요즘은 영상처리기술이 얼마나 진보했나 싶어 자료를 찾아보다 OpenCV 를 이용해 쉽게 얼굴, 눈, 전신, 상체, 하체 등을 인식하는 방법이 있어 소개합니다. 이 프로그램은 Python + OpenCV + PyQt5를 이용해 제작되었습니다. 프로그램 실행파일의 경로에 아래에 소개된 Haar Cascades.xml 파일이 같이 위치해야 합니다. Pyinstaller로 제작된 실행파일 링크 (PyQt5와 OpenCV 모듈에 필한 dll, lib 가 모두 single exe로 포함되어 용량(약 80MB)이 큽니다)  좋아하는 배우인 이선균씨 얼굴을 핸드폰에 띄우고 노트북 웹캠으로 얼굴, 눈을 인식해 봤습니다. [실행 화면] OpenCV 를 이용해 만들었으므로, 컴퓨터 비전에 대한 지식이 없어도 무방합니다. 아래 동영상은 포토샵의 '레나' 이미지를 인식시켜 본 결과입니다.   OpenCV 란? 실시간 컴퓨터 비전을 목적으로 인텔에서 C++로 만든 크로스 플랫폼 라이브러리 파이썬에서도 python -m pip install opencv-python 으로 설치 후 사용 가능 ...

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기