본문 바로가기

개발 프로젝트

[PyQt5] 성경 프롬프터 프로그램

728x90

Preview

제가 일요일마다 교회 가는데 목사님께서는 성경 말씀을 성도들이 찾는 것보다 빔 프로젝터에 띄워서 같이 읽는 걸 좋아하십니다.
그래서 방송 담당 인원이 미리 성경 말씀을 준비해서 PPT자료로 준비를 해야 하는데요,
만약 담당 인원이 못 나오거나 늦게 되면 방송이 매끄럽지 않아 모든 성도가 성경말씀이 프로젝터에 나오기만을 기다리는 경우도 있었습니다.
시중에 이미 개발되어 있는 프로그램을 사용하려고 보니 국내 프로그램으로는 홀리뷰어 라는 프로그램이 제일 유명했습니다.

하지만 성경과 장, 절을 모두 콤보박스로 컨트롤해야 하기 때문에 빠르게 찾을 수가 없었습니다.
그리고 외국 프로그램인 easyslides 는 사용법이나 기능이 복잡해 교회 방송 담당자(초딩)이
사용하기에 어려울 것 같았습니다.
그래서 제가 이 프로그램을 만들게 됐습니다. 쉬운 UI빠른 검색 이 키워드였습니다.

Functions

화면 구성은 홀리뷰어와 비슷합니다. 구현한 기능은 다음과 같습니다.

빠른 검색

  • 창세기 1장 2절을 검색하기 위해선 "창 1 2" 를 검색하면 됩니다.
  • 창세기 1장을 검색하기 위해선 "창 1" 만 검색하면 됩니다.
  • Left 키와 Right 키로 이전 구절 다음 구절 제어가 가능합니다.

즐겨찾기

  • 미리 성경을 즐겨찾기에 등록해놓아 빠르게 찾을 수 있습니다.
  • 더블클릭 시 즐겨찾기 목록에서 제거됩니다.

출력할 모니터 선택

  • 연결되어 있는 모니터를 탐색 후 출력 가능한 모니터 중 선택해서 띄울 수 있습니다.

Methodology

제가 얻은 원본 데이터는 각 성경마다 txt파일로 존재했습니다.

이 txt파일을 하나로 묶어서 Json으로 변환했습니다.
아무래도 사람이 옮기다 보니 원본 데이터에도 잘못 옮겨져 있는 구절들이 있더군요.
전처리 과정을 통해 데이터를 정리해서 깔끔한 JSON 파일을 만들었습니다.

교회에서 사용할 프로그램 개발을 위해 성경말씀 JSON 파일이 필요했는데 인터넷을 뒤져봐도 없더라구요. 그래서 txt파일로 다운받아 JSON 으로 변환했습니다. JSON 으로 변환한 성경 파일을 공유합니다.

성경 json파일

 

bible.json

 

drive.google.com

검색 기능 구현

검색어는 창세기 1장 1절을 "창 1 1"로 검색합니다. 따라서 공백을 기준으로 split 후 JSON데이터의 KEY 값 중 탐색합니다.

def on_search_clicked(self): #검색 버튼 클릭 이벤트
    txt =self.lineEdit.text().split() #검색어
    if len(txt)>2:
        new_dict = self.search_json(txt[0]+txt[1]+":"+txt[2])
        self.addToList(new_dict)
    elif len(txt)>1:
        new_dict = self.search_json(txt[0] + txt[1])
        self.addToList(new_dict)
    elif len(txt) == 1:
        new_dict = self.search_json(txt[0])
        self.addToList(new_dict)
    else:
        self.addToList(self.bibleContents)

def addToList(self, bibleJson):
    self.listView.clear()
    if len(bibleJson)>0:
        for i in bibleJson:
            item = QtWidgets.QListWidgetItem(i)
            self.listView.addItem(item)

def search_json(self, keyword):
        new_dict = {}
        for key in self.bibleContents.keys():
            if keyword in key:
                new_dict[key] = self.bibleContents[key]
        return new_dict

즐겨찾기 기능 구현

미리 성경 말씀을 즐겨찾기 목록에 넣어놓고 띄우기 위해 만든 기능입니다.

def on_fav_item_clicked(self, index): #즐찾 목록을 선택 시 검색 목록 선택 이벤트와 동일하게 동작합니다.
    item_text = index.data(Qt.DisplayRole)
    self.bibleContentEdit.setPlainText(self.bibleContents[item_text])
    find_index = 0
    for index in range(self.listView.count()):
        item = self.listView.item(index)
        if item.text() == item_text:
            find_index = index
            break

    self.listView.setCurrentRow(find_index)

def on_fav_item_double_clicked(self, index): #더블 클릭시 즐찾 목록에서 제거합니다.
    selected_item = self.favView.currentItem()
    if selected_item is not None:
        # 아이템 제거
        row = self.favView.row(selected_item)
        self.favView.takeItem(row)
def on_move_clicked(self):
    current_index = self.listView.currentIndex()
    item_text = current_index.data()
    list_item = QtWidgets.QListWidgetItem(current_index.data())

    for index in range(self.favView.count()): #즐찾 목록에 중복 요소가 존재하면 추가하지 않습니다.
        item = self.favView.item(index)
        if item.text() == item_text:
            return

    self.favView.addItem(list_item)

좌우 버튼 이벤트

모니터에 성경 말씀이 떠있는 상태면 좌 우 키를 통해 이전 구절과 다음 구절로 이동이 가능합니다.

def on_prev_clicked(self):
    current_index = self.listView.currentIndex()
    previous_index = current_index.siblingAtColumn(0).siblingAtRow(current_index.row() - 1)

    if previous_index.isValid():
        # 이전 인덱스 선택
        self.listView.selectionModel().clearSelection()
        self.listView.selectionModel().setCurrentIndex(previous_index, QItemSelectionModel.Select)
        self.on_item_clicked(previous_index)
        if self.window != None :
            self.window.updateContent(previous_index.data(), self.bibleContents[previous_index.data()])

#--------class FullScreenWindow(QtWidgets.QMainWindow)----------#
def keyPressEvent(self, event):
    # ESC 키를 눌렀을 때 윈도우를 닫음
    if event.key() == Qt.Key_Escape:
        self.close()
    elif event.key() == Qt.Key_Left:
        self.parent.on_prev_clicked()
    elif event.key() == Qt.Key_Right:
        self.parent.on_next_clicked()

def updateContent(self, title, content):
    self.titleLbl.setText(title)
    self.contentLbl.setText(content)

출력할 모니터 선택

QDesktopWidget 으로 연결된 디스플레이 정보를 가져온 후에 출력 가능한 모니터 목록을 보여주고 사용자가 선택한 모니터에 내용을 띄웁니다.

def get_display_info(self,app):
    # 모든 활성화된 스크린 정보 가져오기
    screens = app.screens()
    display_info = []
    for i, screen in enumerate(screens):
        screen_info = {
            'Screen': i + 1,
            'Geometry': screen.geometry(),
            'Available Geometry': screen.availableGeometry(),
            'Physical Size': screen.physicalSize(),
            'Logical DPI': screen.logicalDotsPerInch(),
            'Physical DPI': screen.physicalDotsPerInch(),
        }
        display_info.append(screen_info)

    return display_info

def set_display_info(self,screens):
    self.comboBox.addItems(screens)
def on_show_clicked(self): #모니터에 출력하기 버튼 이벤트
    screen_index = self.comboBox.currentIndex()
    screen_geometry = QtWidgets.QDesktopWidget().screenGeometry(screen_index)
    selected_indexes = self.listView.selectedIndexes()
    if selected_indexes:
        title = selected_indexes[0].data()
        if self.window != None : #이미 떠있는 성경 말씀이 있다면 내용을 업데이트합니다.
            self.window.updateContent(title, self.bibleContentEdit.toPlainText())
        else:
            self.window = FullScreenWindow(self, self.widthSize.text(), self.heightSize.text(), self.fontSize.text(), screen_index=screen_index, title=title, content=self.bibleContentEdit.toPlainText())
            self.window.setGeometry(screen_geometry)
            if self.fullCheck.isChecked(): #전체화면 체크박스가 되어있다면 전체화면으로 띄웁니다.
                self.window.showFullScreen()
            else :
                self.window.show()

Download

아래 링크로 접속해 다운로드 가능합니다. exe 프로그램을 실행하면 됩니다.

https://drive.google.com/file/d/1YS_e9BIdNn02wmAa-6wVoMctKjmnqKYE/view?usp=sharing

 

biblePromt_v1.0.3.zip

 

drive.google.com

 

https://drive.google.com/file/d/1JcGXOYN_ck8rP-2OezHgvdRqq7wTyz3A/view?usp=sharing

 

biblePromt_v1.0.4.zip

 

drive.google.com

 

--------2023.12.02(토) 수정----------

교회 노트북의 OS 가 MS에서 더이상 지원하지 않는 Window7 라서 프로그램이 실행이 되지 않았습니다.

이유는 파이썬 3.11 이 Window7에서 사용할 수 없다고 합니다. 그 외 여러 파이썬 프로그램을 돌리기 위한 여러 dll 파일이 없어 에러가 계속 나더군요..

Visual studio 2015 팩을 설치해서 관련 dll 을 다 다운로드 받거나 제가 파이썬 버전을 낮춰 pyqt 앱을 다시 빌드하는 방법, 혹은 웹에서 동작하도록 JS로 개발해야 하나.. 등등 여러 방법이 생각났지만...

그냥 교회 PC 의 OS를 window10으로 업그레이드하기로 했습니다.

 

-------2024.03.31(일) 수정 ---------

댓글로 남겨주신 개선사항 반영해서 프로그램 다시 올려놨습니다.

추가기능 : Font 설정, 장과 절 폰트 크기 지정

 

-------2024.04.07(일) 수정 ---------

즐겨찾기 목록에 있는 구절 선택 후 모니터에 출력하면 제목이 바뀌지 않던 현상 수정했습니다.

 

-------2024.04.014(일) 수정 ---------

성경 검색 기능 수정 

- 성경단축어가 낮선 분들을 위해 창 1 2 로 찾았던걸 "창세기 1 2" 로 찾도록 수정했습니다.

배경 이미지를 설정할 수 있도록 수정했습니다. 

- _internal/public/ 에 원하는 이미지를 넣고 이름을 bg.jpg 로 변경하면 됩니다.

 

 

------2024.05.26(일) 수정 -----------

영어 버전(NIV) 성경을 추가했습니다.

 

 

------2024.08.05(월) 수정 ------------

컴퓨터가 고장나 영어 버전의 프로그램은 복구를 못했습니다.. 검색 기능 개선과 영어 버전 이전의 버전의 프로그램을 다시 업로드했습니다.