파이썬 예제 (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']
                    
        # LineEdit 생성
        self.lineEdit = QLineEdit()       
                
        # 단계 1 : 모든 단어들 중 빈도수 많은 단어 리스트 + 횟수
        words = Counter(allWords).most_common()
        print(words)

        # 단계 2 : 모든 단어들 중 빈도수 많은 순서대로 추천 단어 리스트 생성
        recommended_words = []
        for i in words:
            recommended_words.append(i[0])

        # 단계 3: 단어 자동 완성자 생성 및 라인 에디터에 추천 단어 등록          
        completer = QCompleter(recommended_words)        
        self.lineEdit.setCompleter(completer)       

        box = QVBoxLayout()        
        box.addWidget(self.lineEdit)
        self.setLayout(box)
        self.show()        


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = CWidget()    
    sys.exit(app.exec_())

먼저 단어리스트와 입력창으로 사용할 QLineEdit 컨트롤을 생성합니다.

이후 18번 라인의 Counter class의 most_common() 함수를 이용해 해당 리스트의 단어와 중복 횟수에 대한 튜플(단어, 횟수)들을 리스트로 리턴 받습니다.

예를 들면 아래와 같은 리스트로 횟수가 많은 단어부터 정리되어 리턴받습니다.

[(python, 2) , (ocean, 1), ...] ->python 2회, ocean 1회

22번 라인의 2단계에서 횟수는 필요없으므로 제외하고, 해당 리스트에 저장된 튜플의 첫 요소(단어)만 다시 정리해 리스트에 저장합니다.

마지막으로 27번 라인 Qt의 QCompleter Class 를 해당 단어리스트로 생성한 후, 라인에디트의 setCompleter() 함수를 이용해 적용하면 끝입니다.

다음 시간에는 QComboBox를 이용한 자동단어완성에 대해 살펴보겠습니다.

감사합니다.

댓글

  1. 안녕하세요?
    좋은 정보 잘 봤습니다.
    입력 받은 self.lineEdit.text 값은 어떻게 받나요?
    print를 해 봐도 출력이 안되어서 여쭤 봅니다

    답글삭제
    답글
    1. 라인에디트 컨트롤의 text() 메서드를 호출하면 됩니다.

      txt = self.lineEdit.text()

      반대로 글씨를 적는것은 setText('적을글자') 메서드 입니다.

      삭제

댓글 쓰기

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)