만든 파이썬 코드를 파이썬이 설치되 있지 않은 컴퓨터에서도 간단하게 사용할 수 있도록 실행 파일로 만들어 보자

auto py to exe는 Pyinstaller를 편리하게 사용할 수 있도록 만들어진 UI이므로 우선 Pyinstaller를 설치하자



Pyinstaller

py to exe 모듈은 다양하다. 그 중 간편한 Pyinstaller를 이용해 보겠다.


우선 설치를 하자 하단의 명령어를 명령 창에 입력한다.


pip install Pyinstaller


다음 PyQt5를 빌드하기 위해 C:\Users\Been\Anaconda3\Lib\site-packages\PyQt5\qt\bin를 환경 변수로 등록합니다.


*환경 변수를 등록했지만 PyQt5에서 에러가 난다면 PyQt5와 PyQt5-sip 파일의 설치 위치를 알아보자

 PyQt5를 uninstall하고 다시 설치하면 PyQt5-sip과 함께 설치되며 설치 디렉터리를 알려준다.






Auto py to exe

이제 Auto py to exe를 설치해 보겠다.


명령 창에 하단의 명령어를 입력한다.


pip install auto-py-to-exe


설치가 끝나면 명령창에 auto-py-to-exe를 입력해 프로그램을 실행한다.




gui파이썬 코드를 선택한다.


onefile은 파일을 exe파일 하나로 출력할 것인지 부가적으로 나오는파일을 그대로 출력할 것인지 설정하는 옵션이다.

one File을 클릭하자


Console Window는 명령 창을 띄울것 인지 설정하는 창이다.

도스 창으로 print시켜 코드 흐름을 확인하고 싶으면 Console Based를 아니면 깔끔하게 Window Based (hide the console)을 클릭한다.




만약 gui 파이썬 코드 이외에 import된 다른 파이썬 코드가 있다면 Additional Files에서 파일 또는 폴더 전체를 추가한다.



GUI를 이용하다 보면 코드가 도는 동안 GUI가 응답 없음 상태가 됨을 확인할 수 있다.

이 현상을 없애기 위해 쓰레드를 나누어 코드가 돌아가는 동안 GUI도 함께 돌려 해결해보자



Thread

쓰레드(Thread)란 하나의 프로세스안에 일을 병렬로 처리하는 단위

자세한건 나중에 시스템 프로그래밍을 공부하며 다시 쓰겟다.



우선 쓰레드 Class를 정의해 준다.

쓰레드를 통해 돌리고 싶은 코드를 run함수에 작성한다.


1
2
3
4
5
class ThreadClass(QtCore.QThread): 
    def __init__(self, parent = None): 
        super(ThreadClass,self).__init__(parent)
def run(self): 
#~~~~~
cs


다음 GUI class에 __init__ 부분에서 쓰레드 Class를 이용해 쓰레드 변수를 정의한다.


1
2
3
class Ui_MainWindow(object):
    def __init__ (self, parent = None) :
        self.threadclass = ThreadClass() 
cs



마지막으로 쓰레드를 사용하고 싶은 곳에서 쓰레드를 실행 해 준다.


1
self.threadclass.start() 
cs



그러면 이제 GUI가 잘 돌아갈 것이다





'파이썬 > Pyqt5를 이용한 GUI' 카테고리의 다른 글

Pyqt5를 이용한 GUI - 버튼설정  (1) 2019.02.02
Pyqt5를 이용한 GUI  (0) 2019.02.02

Qt designer를 이용해 간단하게 인터페이스를 만들었다면 이제 인터페이스에 우리가 원하는 기능을 넣어 보자



버튼 클릭

버튼을 만들어도 클릭 시 이벤트가 발생하지 않으면 무용 지물이다.


self.pushButton.clicked.connect(self.btn1_clicked)를 입력해 준다.


1
self.pushButton.clicked.connect(self.btn1_clicked)  
cs


또한 클래스내 btn1_clicked함수를 정의해 주면 버튼 클릭 시 btn1_clicked함수를 실행하게 된다.


1
2
class MyWindow(QMainWindow, form_class):
    def btn1_clicked(self):
cs




버튼 활성화 비활성화

버튼을 입력하면 필요 시 까지 버튼을 비 활성화해 클릭을 불가능하게 할 수도 있다.


1
self.pushButton.setDisable(True)
cs




반대로 활성화 하고 싶으면

1
self.pushButton.setEnable(True)
cs






만든 파이썬 프로그램을 편하게 사용할 수 있도록 GUI를 만들어 보자



PyQt5

먼저 PyQt5를 설치해 보자

Amaconda prompt를 실행 해 하래 명령어를 입력한다.


pip install pyqt5


PyQt5는 Qt designer하는 Ui를 지원해 보다 편하게 내가 원하는 GUI를 만들 수 있다.




Qt designer


그럼 Qt designer를 이용해 GUI를 만들어 보자

실행 방법은 2가지가 있다. 


1. 아나콘다 설치 디렉터리(C:\Users\Been\Anaconda3\\Library\bin)로 가서 designer.exe 파일을 찾아 실행시킨다.

* 설치 디렉터리는 다를 수 있다.

2. Amaconda prompt를 실행 후 designer를 입력한다.


두 가지 중 편한 방식을 사용하자



이후 원하는 위젯을 배치 하고 속성 탭을 이용해 GUI를 만들고 저장하자




그러면 .ui라는 파일로 저장이 가능하다. 이제 이 파일을 파이썬 코드로 변환 시킬 것이다.





파이썬 코드로 변환


.ui 파일은 XML언어로 구성되어 있다. 그래서 우리는 XML코드를 파이썬 코드로 변환 시켜 줘야 한다.

(아직 XML언어에 대해 잘 모른다... 나중에 따로 공부하자)


변환 방법은 우선 C:\Users\Been\Anaconda3\Lib\site-packages\PyQt5\uic 파일로 가자


변환할 .ui파일을 해당 디렉터리에 복사를 한다.




해당 디렉터리에서 Shift + 마우스 오른쪽 버튼 으로 [여기서 명령 창 열기]를 클릭해 간편하게 필요한 주소로 명령 창을 연다.


명령 창에 하단의 명령어를 입력해 변환시킨다.


python -m PyQt5.uic.pyuic '.ui파일명.ui' -o '원하는 파일명.py'





그러면 C:\ProgramData\Anaconda3\Lib\site-packages\PyQt5\uic 디렉토리에 .py파일이 생성된 것을 볼 수 있다.



중간 중간 함수 내용이 궁금하면

https://github.com/python-openxml/python-docx

여기로 들어가면 된다.




스타일 변경

글을 쓸 때 폰트 명, 폰트 크기등을 변경 시키고 싶을 것이다.

기본 설정 폰트를 변경하고 싶으면 document.styles['Normal'] 을 변경하면 된다.


1
2
3
style = document.styles['Normal']
style.font.name = '맑은 고딕'
tyle.font.size = Pt(8)
cs



* 한글폰트 변경


하지만 이 방식은 영문 폰트만 변경 되고 한글 폰트는 변경되지 않는다.

아쉽게도 한글 폰트 변경을 지정한 클래스가 없기 때문에 우리는 직접 설정해 줘야한다.


1
2
3
from docx.oxml.ns import qn, nsdecls
 
style._element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕'# 한글 폰트를 따로 설정해 준다
cs

이런 방법으로



* 스타일 생성


만약 새로운 스타일을 정의해 쓰고 싶다면


1
2
3
style_make = document.styles.add_style('banana', WD_STYLE_TYPE.CHARACTER)
 
document.add_paragraph("banana", style = style_make)
cs

이런 방법으로 사용하면 된다.




Head 지정 및 Head Style 변경

본문을 작성하면 제목을 써야 하고 제목으로 본문을 정리할 수 있다.

방식은 스타일을 새로 만드는 것과 비슷하다. 하지만 Head는 기본 정의된 Heading1~9를 바탕으로 지정 가능하다.

Heading은 1부터 9까지 순차적으로 대 분류에서 소 분류로 정의 되어 있다.


1
2
3
4
5
6
7
8
style_1 = document.styles.add_style('Heading_1', WD_STYLE_TYPE.PARAGRAPH)
style_1.base_style = document.styles['Heading 1']
style_1.font.name = '맑은 고딕'
style_1._element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕'# 한글 폰트를 따로 설정해 준다
style_1.font.size = Pt(14)
style_1.font.color.rgb = RGBColor(0x000x000x00)
 
document.add_paragraph("banana" , style='Heading_1')
cs

*폰트 색상은 RGB 16진수로 입력하면 원하는 색상이 된다.

중간 중간 함수 내용이 궁금하면

https://github.com/python-openxml/python-docx

여기로 들어가면 된다.



표 만들기(add_table())

표를 만들기 위해 우선 add_table함수를 통해 행렬의 갯수를 입력한다.

표 스타일은 기본인 'Table Grid'로 뒀다.

이후 셀에 가운데 정렬로 알파벳을 순서대로 입력한 예제이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
from docx import Document
 
document = Document()
 
table = document.add_table(rows = 1, cols = 4)
table.style = document.styles['Table Grid']
 
hdr_cells = table.rows[0].cells
hdr_cells[0].paragraphs[0].add_run('A').bold = True
hdr_cells[0].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER  #가운데 정렬
hdr_cells[1].paragraphs[0].add_run('B').bold = True
hdr_cells[1].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
hdr_cells[2].paragraphs[0].add_run('C').bold = True
hdr_cells[2].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
cs




셀 크기 조절하기(cells[0].width)

만든 표의 셀 크기도 조절 가능하다.


1
hdr_cells[0].width = Cm(2.9)
hdr_cells[0].height = Cm(2.9)
cs





셀 추가하기(table.add_row())

표를 만든 후 추가적으로 셀을 삽입 할 때 사용

셀을 추가한 후에는 테이블 사용과 동일하다.


1
2
3
4
5
6
7
row_cells = table.add_row().cells
row_cells[0].paragraphs[0].add_run('A').bold = True
row_cells[0].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
row_cells[1].paragraphs[0].add_run('B').bold = True 
row_cells[1].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
row_cells[2].paragraphs[0].add_run('C').bold = True 
row_cells[2].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
cs





셀 배경색 넣기

셀에 배경색을 넣는 함수는 따로 없기 때문에 직접 xml을 건드려 바꿔준다.

w:fill="BFBFBF" 에서 원하는 색상을 RGB값 16진수로 입력하면 된다.

table.rows[0].cells[0] 자리에 원하는 셀을 입력하면 된다. 


1
2
3
4
from docx.oxml import parse_xml

shading_elm = parse_xml(r'<w:shd {} w:fill="BFBFBF"/>'.format(nsdecls('w'))) #음영
table.rows[0].cells[0]._tc.get_or_add_tcPr().append(shading_elm)
cs





셀 병합(merge())

표 제작의 마지막으로 병합을 해보자 

병합은 두 셀 값을 받아 사각형 모양으로 병합이 된다.


1
2
3
t_sum_a = table.cell(10)
t_sum_b = table.cell(20)
t_sum_a.merge(t_sum_b)
cs



다음 글에선 스타일 변경 및 생성에 대해 포스팅 하겠다.



중간 중간 함수 내용이 궁금하면

https://github.com/python-openxml/python-docx

여기로 들어가면 된다.




python-docx를 사용하기에 앞서 Document() 함수를 변수에 입력해 준다.


1
2
3
from docx import Document
 
document = Document()
cs




add_paragraphs()


본문은 add_paragraphs()함수를 이용해 입력해 준다.

* 이후 같은 paragraphs에 입력을 원할경우 add_run() 함수를 사용한다.


1
2
3
4
5
6
from docx import Document
 
document = Document()
 
document.add_paragraph("본문")
document.add_paragraph.add_run('추가 본문')
cs




굵게, 기울임 (.bold / .italic)

본문을 굵게 만들고 싶다면 .bold 와 .italic 을 사용하면된다.


1
2
3
4
5
6
from docx import Document
 
document = Document()
 
document.add_paragraph("본문").bold = True
document.paragraphs[-1].add_run('BOLD \n').italic = True
cs





중앙 정렬 (WD_ALIGN_PARAGRAPH.CENTER)

중앙 정렬을 하기 위해선 WD_ALIGN_PARAGRAPH 을 import 해 줘야 한다.

그리고 이전 paragraph을 지정해 중앙 정렬해 주면 된다.


1
2
3
4
5
6
7
8
9
10
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
 
document = Document()
 
document.add_paragraph("본문").bold = True
document.paragraphs[-1].add_run('BOLD \n').italic = True
 
last_paragraph = document.paragraphs[-1
last_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
cs





이미지 삽입 (add_pcture())

이미지를 삽입 할 때 가로 길이와 세로길이를 지정해 불러올 수 있다.

width()는 가로 길이, height는 세로 길이를 지정한다.


1
2
3
4
5
6
7
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Cm, Inches
 
document = Document()
 
document.add_picture(Text_image_name,width= Cm(4.91), height= Cm(8))
cs

*길이의 경우 CM이외에도 인치(Inches) 등의 단위도 사용 가능 하다.




저장하기 (save())

마지막으로 작성한 워드 파일을 저장하는 함수이다.

함수 안에 원하는 파일 명을 입력하면 끝


1
2
3
4
5
from docx import Document
 
document = Document()
 
document.save('make.docx')
cs


파싱한 데이터를 그냥두면 파싱한 이유가 없다.

그래서 파싱한 데이터를 문서화 시키려고 하는데

이 또한 자료가 부족했다.


그래서 부족한 정보이지만 나누고자 글을 쓴다.






Python-docx


Python-docx : 파이썬을 이용해 워드 문서를 작성할 수 있게 만든 모듈




Python-docx 다운 방법


이전 문서인 pyparsing을 다운 받는 방법과 동일하다.

간단하다 pip을 이용해 아래와 같이 입력해 다운받으면 된다.

아나콘다를 사용하지 않는다면 윈도우에서 pip 다운로드 사용방법을 검색해 보자


pip install python-docx


이후 코드에 docx을 import 해 모듈을 사용하면 된다.


1
import docx
cs


+ Recent posts