PyQt를 활용한 PDF 파일생성, 저장, 인쇄

이미지
이번에 만든 예제는 python과 PyQt5를 이용해 pdf 파일 생성 과 프린터 인쇄 에 대한 주제를 다룹니다. pyinstaller로 제작된 실행파일 링크: 다운로드 프로그램의 실행 모습은 아래와 같습니다. 화면의 내용이 출력된 결과를 보여주기 위해 더미 테이블 데이터를 생성하고 버튼 2개로 구성해 보았습니다. [프로그램 실행화면] 하나의 더미 QTableWidget 과 2개의 QPushButton 으로 구성되어 있습니다. 1. 'Print PDF File' 버튼을 누른 경우 (프린터 창 띄우고 인쇄) [인쇄 창 열기] [프린터를 통해 실제 인쇄된 모습] 자세한 내용은 이어지는 코드 분석에서 설명드리겠지만, 대략 아래의 흐름으로 진행됩니다. QPrinter class 생성 (프린터) QPrinterDialog class 생성 (프린터 설정창) QPainter class 생성 (화면 출력 클래스) 출력하고자 하는 위젯(QTableWidget)을 QPainter에 맞춤 QTableWidget의 render() 함수를 이용한 인쇄 인쇄창에서 실제 프린터가 아닌 'Microsoft Print To PDF'를 선택한 경우, PDF파일 생성도 가능합니다. 2. 'Make PDF File' 버튼을 누른 경우 (PDF 파일 생성) 프로젝트의 기본 경로 (변경 가능)에 다음과 같은 PDF 파일 생성 ...

QComboBox를 이용한 단어자동완성

이미지
이번에는 Python과 PyQt5의 QComboBox를 이용한 자동완성 (AutoCompletion)을 살펴보겠습니다. 좀 쉽게 생각하고 만들어 보았으나, 만드는 과정에서 한가지 문제점이 있었습니다. 바로 QComboBox에 QLineEdit를 추가 해 목록을 수정가능 하게 만드는 과정에서, 입력한 단어가 QComboBox에 원치않게 추가되는 부분이 있었습니다. 예를 들면 콤보박스에 추가되는 아이템의 목록이 아래 리스트와 같다면, allWords = ['부서', '사원', '이름', '직급', '나이'] 아래와 같이 콤보박스의 아이템들이 보여집니다. "나" 라는 단어를 검색한 후 아래와 같이 아이템이 Popup 된 상태에서 엔터키를 누르면 "나"라는 단어가 의도치 않게 콤보박스의 목록에 삽입되어 나오는 문제입니다. 해결과정은 아래 소스코드분석에서 말씀드리겠습니다. 먼저 전체 코드는 아래와 같습니다. from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QLineEdit, QCompleter, QVBoxLayout from PyQt5.QtCore import Qt import sys QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) class CWidget(QWidget): def __init__(self): super().__init__() # 단어 리스트 allWords = ['부서', '사원', '이름', '직급', '나이'] # QCombo 생성 ...

QLineEdit를 이용한 단어자동완성

이미지
입력창에 검색할 내용을 넣으면 자동으로 해당 단어의 추천단어를 찾아서 표시(AutoComplete) 해 주는 기능을 Python과 PyQt5를 이용해 만들어 보았습니다. 구글이나 네이버 검색창에 해당 문자의 일부분을 작성하면 단어를 자동 완성 해주는 기능이죠. 파이썬으로 아래와 같이 만들어 보았습니다. [프로그램 실행화면] 만약 파이썬 단어 리스트가 아래와 같다면, " python " 이란 단어가 "p"로 시작하는 단어중에서 가장 많으므로, "p"를 입력하면 "python"이 QLineEdit에서 먼저 표시되게 됩니다. allWords = ['ocean', 'coding', 'python', 'python', 'pizza'] 미리 만들어진 리스트 안 단어들의 내용을 분석해 (중복 단어) 가장 빈도수가 높은 단어를 우선 표시해주는 기능입니다. from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QCompleter, QVBoxLayout from PyQt5.QtCore import Qt from collections import Counter import sys class CWidget(QWidget): def __init__(self): super().__init__() # 단어 리스트 allWords = ['ocean', 'coding', 'python', 'python', 'pizza'...

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...

이 블로그의 인기 게시물

Qt Designer 설치하기

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