Amazfit Bip Font Creator 3 - 쓰레드 실행
쓰레드 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
import os import binascii import glob import shutil from PyQt5.QtCore import QThread, pyqtSignal from fontTools.ttLib import TTFont from PIL import ImageFont, ImageDraw, Image
class FontCreator(QThread): set_progress_text = pyqtSignal(str) set_progress = pyqtSignal(int, int) done = pyqtSignal()
def __init__(self, font_path, margin_top, margin_left, delete_bmp, overwrite_bmp, root_path, parent=None): QThread.__init__(self, parent) self.font_path = font_path self.margin_top = int(margin_top) self.margin_left = int(margin_left) self.delete_bmp = delete_bmp self.overwrite_bmp = overwrite_bmp
self.tt_font = TTFont(self.font_path) self.image_font = ImageFont.truetype(self.font_path, 15) self.root_path = root_path
self.bmp_dir = None self.ft_dir = None self.bmp_dir = self.create_directory('bmp') self.ft_dir = self.create_directory('ft')
|
QThread 를 상속받아 구현합니다.
- font_path : 폰트 파일 경로
- margin_top : 비트맵 상단 여백
- margin_left : 비트맵 좌측 여백
- delete_bmp : 비트맵 삭제 여부
- overwrite_bmp : 비트맵 덮어쓰기 여부
- root_path : 실행 경로
- parent : 부모 쓰레드
parent를 꼭 __init__을 해주어야 합니다.
1
| QThread.__init__(self, parent)
|
pyqtSignal
부모 쓰레드에 전달을 위한 시그널을 3개 생성합니다.
1 2 3
| set_progress_text = pyqtSignal(str) set_progress = pyqtSignal(int, int) done = pyqtSignal()
|
- set_progress_text : 텍스트 변경시 사용
- set_progress : 진행률 변경시 사용
- done : 완료시 사용
1 2 3 4 5 6 7 8 9
| class AmazfitBipFontCreator(QMainWindow): def create_font(self): font_creator_thread = FontCreator(font_path, margin_top, margin_left, delete_bmp, overwrite_bmp, self.root_path, self) font_creator_thread.set_progress_text.connect(self.set_progress_text) font_creator_thread.set_progress.connect(self.set_progress) font_creator_thread.done.connect(self.create_done) font_creator_thread.start()
|
AmazfitBipFontCreator 에서 create_font 실행시에, 부모 쓰레드 전달을 위해 self
를 넘겨주었습니다.
그리고 시그널 들을 함수에 연결하였습니다.
- set_progress_text.connect(
self.set_progress_text
)
- set_progress.connect(
self.set_progress
)
- done.connect(
self.create_done
)
pyqtSignal Connect
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from PyQt5.QtCore import pyqtSlot
class AmazfitBipFontCreator(QMainWindow): @pyqtSlot(str) def set_progress_text(self, text): self.lbl_prog.setText(text) @pyqtSlot(int, int) def set_progress(self, current, end): val = current / end * 100 self.progress.setValue(int(val)) @pyqtSlot() def create_done(self): self.set_progress_text('Finished') self.set_progress(1, 1) self.btn_create.setEnabled(True) msg_box = QMessageBox() msg_box.setWindowTitle('Font Creator') msg_box.setText('Finished') msg_box.addButton(QPushButton('OK'), QMessageBox.NoRole) msg_box.exec()
|
@pyqtSlot
어노테이션을 사용하고 파라미터 타입(str)
을 지정합니다.
- @pyqtSlot(str)
- @pyqtSlot(int, int)
- @pyqtSlot()
완료 시그널이 보내지면 OK
메시지 창을 보여줍니다.
1 2 3 4 5
| msg_box = QMessageBox() msg_box.setWindowTitle('Font Creator') msg_box.setText('Finished') msg_box.addButton(QPushButton('OK'), QMessageBox.NoRole) msg_box.exec()
|